tcp四次挥手

TCP的三次握手与四次挥手理解及面试题

て烟熏妆下的殇ゞ 提交于 2019-12-01 19:50:16
TCP的三次握手与四次挥手理解及面试题 1. 基本概念 2. 三次握手过程理解 3. 四次挥手过程理解 4. 常见面试题 1. 基本概念 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接 注意:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。 字段含义 : URG 紧急指针是否有效

TCP四次挥手(图解)-为何要四次挥手

假装没事ソ 提交于 2019-12-01 19:46:18
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。 第一次挥手:主机1(可以使客户端,也可以是服务器端),设置 Sequence Number 和 Acknowledgment Number ,向主机2发送一个 FIN 报文段;此时,主机1进入 FIN_WAIT_1 状态;这表示主机1没有数据要发送给主机2了; 第二次挥手:主机2收到了主机1发送的 FIN 报文段,向主机1回一个 ACK 报文段, Acknowledgment Number 为 Sequence Number 加1;主机1进入 FIN_WAIT_2 状态;主机2告诉主机1,我“同意”你的关闭请求; 第三次挥手:主机2向主机1发送 FIN 报文段,请求关闭连接,同时主机2进入 LAST_ACK 状态; 第四次挥手:主机1收到主机2发送的 FIN 报文段,向主机2发送 ACK 报文段,然后主机1进入 TIME_WAIT 状态;主机2收到主机1的 ACK 报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。 为何要四次分手呢? 那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着

用Java代码简单的通信过程

折月煮酒 提交于 2019-12-01 19:45:00
TCP提供了一种面向连接的、可靠的字节流服务。面向连接比较好理解,就是连接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话。助于可靠性,TCP协议中涉及了诸多规则来保障通信链路的可靠性,总结起来,主要有以下几点: (1)应用数据分割成TCP认为最适合发送的数据块。这部分是通过“MSS”(最大数据包长度)选项来控制的,通常这种机制也被称为一种协商机制,MSS规定了TCP传往另一端的最大数据块的长度。值得注意的是,MSS只能出现在SYN报文段中,若一方不接收来自另一方的MSS值,则MSS就定为536字节。一般来讲,在不出现分段的情况下,MSS值还是越大越好,这样可以提高网络的利用率。 (2)重传机制。设置定时器,等待确认包。 (3)对首部和数据进行校验。 (4)TCP对收到的数据进行排序,然后交给应用层。 (5)TCP的接收端丢弃重复的数据。 (6)TCP还提供流量控制。 TCP报文: (1)TCP封装数据的格式: (2)TCP首部的格式: TCP首部报文格式的说明: ( 1 )每个 TCP 段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。这两个值加上 IP 首部的源端 IP 地址和目的端 IP 地址唯一确定一个 TCP 连接。 ( 2 )序号用来标识从 TCP 发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节

Java进阶知识 —— TCP四次挥手(图解)-为何要四次挥手

橙三吉。 提交于 2019-12-01 19:44:44
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。 第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了; 第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求; 第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态; 第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。 为何要四次分手呢? 那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了

tcp三次握手详解

蹲街弑〆低调 提交于 2019-12-01 19:44:32
1、建立连接协议(三次握手)   (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。   (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。   (3) 客户必须再次回应服务段一个ACK报文,这是报文段3。    2、连接终止协议(四次挥手)   由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。 收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。   (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。   (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。   (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。   (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。    CLOSED: 这个没什么好说的了,表示初始状态。    LISTEN: 这个也是非常容易理解的一个状态

TCP四次挥手过程

拜拜、爱过 提交于 2019-12-01 19:41:34
四次挥手 状态转化: A、B连接建立状态ESTABLISHED -> A终止等待1状态FIN-WAIT-1 -> B关闭等待状态2CLOSE-WAIT -> A终止等待2状态FIN-WAIT-2 -> B最后确认状态LAST-ACK -> A时间等待状态TIME-WAIT -> B、A关闭状态CLOSED 四次挥手过程 第一次挥手:A数据传输完毕需要断开连接,A的应用进程向其TCP发出连接释放报文段(FIN = 1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态,等待B的确认。 第二次挥手:B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。而A收到B的确认后,进入FIN-WAIT-2状态,等待B发出的连接释放报文段。 第三次挥手:当B数据传输完毕后,B发出连接释放报文段(FIN = 1,ACK = 1,序号seq = w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A 的最后确认。 第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉

简述TCP的三次握手与四次挥手过程

假装没事ソ 提交于 2019-12-01 19:41:17
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手. 完成三次握手,客户端与服务器开始传送数据 A与B建立TCP连接时:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了! 一、TCP报文格式 TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效

通俗介绍TCP三次握手四次挥手

谁说我不能喝 提交于 2019-12-01 19:40:58
一直都知道 TCP 建立连接时需要三次握手,释放连接时需要四次挥手,也大概能说出整个过程,但是一直对其中的设计思想理解不深,停留在“只可意会,不可言传”的阶段。这次写一篇博客尝试将其中的思想表达出来。 TCP 建连三次握手 首先解释一下每个步骤的作用: 1、a 时刻,A 准备就绪,发送 SYN 包给 B,尝试建立连接 2、b 时刻,B 收到 A 发来的 SYN 包,知道 A 要请求建连,回 SYN ACK 包,告诉 A 自己收到了建连请求,可以建连了 3、c 时刻,A 收到了 B 的回复,知道 B 准备好了,链路通畅,可以发送数据了。回 ACK 告知 B 收到了 B 的回复,下面要开始发送该数据了 4、d 时刻,B 收到了 A 的回复,知道 A 接下来要发数据了。至此,AB 双方都确认整个链路已经可靠了,接下来可以发送数据了。 为什么要多次确认呢?为什么不可以 A 上来就直接发送数据给 B 呢? 这里首先要明确一点,TCP 是传输层的协议,是建立在物理层、数据链路层、网络层之上的协议,而底层的网络是不可靠的,可能路由出问题,可能网关出问题,可能网线出问题,A 没法保证自己发出来的消息 B 一定能收到,所以一定要反馈机制,即 ACK,这样才能在不可靠的网络层智商构建可靠的传输层。 类比一下生活中的例子,可以帮助我们理解 示例1,假设我们在火车上打电话,通话质量很差

TCP协议的三次握手和四次挥手

拟墨画扇 提交于 2019-12-01 19:40:47
TCP/IP协议三次握手与四次握手流程解析 Http协议三次握手过程 简述Socket,IP,TCP三次握手,HTTP协议 TCP/IP协议的三次握手及实现原理 SYN Flood攻击与防御方法 一、TCP报文格式 TCP报文格式图: 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。 (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下: (A)URG:紧急指针(urgent pointer)有效。 (B)ACK:确认序号有效。 (C)PSH:接收方应该尽快将这个报文交给应用层。 (D)RST:重置连接。 (E)SYN:发起一个新连接。 (F)FIN:释放一个连接。 需要注意的是: (A)不要将确认序号Ack与标志位中的ACK搞混了。 (B)确认方Ack=发起方Req+1,两端配对。 二、三次握手 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接 位码即tcp标志位,有6种标示: SYN(synchronous 建立联机 ) ACK

TCP的三次握手和四次挥手简述

僤鯓⒐⒋嵵緔 提交于 2019-12-01 19:40:37
TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。 TCP TCP通信需要经过创建连接、数据传送、终止连接三个步骤。 TCP通信是面向连接并且可靠的。通信双方在正式进行通信之前必须先建立可靠一对一的连接,并且分配一定的系统内核资源,双发的数据通过这个连接进行,而且当通信结束之后双发必须断开连接以释放系统资源。 TCP采用发送应答机制,每次传输的成功都依赖于发送和回应。如果在一定时间没有收到回应,则会进行重发。并且为了不丢包,每个数据包中都有一个序号,同时序号也保证了传送到接收端实体的包的按序接收。 TCP客户端的实现代码: from socket import * # 创建socket tcp_client_socket = socket(AF_INET, SOCK_STREAM) # 目的信息 server_ip = input( "请输入服务器ip:" ) server_port = int(input( "请输入服务器port:" )) # 链接服务器 tcp_client_socket.connect((server_ip, server_port)) # 提示用户输入数据 send_data = input( "请输入要发送的数据