对TCP三次握手四次挥手的理解
1,TCP段组成
上图就是TCP段组成部分,每一行由32bits组成。每个部分的含义请参照博客Wireshark-TCP协议分析(包结构以及连接的建立和释放)
1.1, TCP socket
一个socket
就是一个处于应用层和传输层之间的软件接口。当一个应用发送消息时,消息会经由socket
到达传输层,反之,传输层传递消息给socket
至应用层被处理。TCP socket
(虚拟端口)用于确定唯一的网络连接。所谓“虚拟”就是一个物理连接支持多路连接。两个端点被视为一个socket
。目的端口和源端口都是由16bits确定的,所以端口最大值可用为65535
。
1.2,TCP复用和解复用
复用是多对一
的过程。在发送方,有很多应用层的数据需要被传输,传输层接收所有的不同socket
端口的消息,加上TCP头部传输给网络层这个过程叫做复用。
解复用是复用的逆过程,是一对多
的过程。在接收方,传输层接收网络层的数据包,移除IP头部,检查端口号,传输数据包给相应的socket
,进而被不同的应用处理,这个过程叫做解复用。
2,TCP三次握手
TCP利用三次握手的方法通过IP协议建立TCP/IP 连接。三次握手通常指"SYN-SYN-ACK"
(其中SYN是synchronize
的大写缩写,ACK指acknowledge
的大写缩写),更准确地是"SYN,SYN-ACK,ACK"
,因为两台电脑开启TCP会话需要按序传输以上三条消息。两台电脑传输数据前(SSH数据,HTTP数据),三次握手机理让试图交流的双方进行网络TCP socket
(套接字)参数的协商。
三次握手过程的设计也是为了使两端可以同时启动和协商各自的TCP socket
连接。并且能够同时在两个方向上协商多个TCP socket
连接。通过多路复用单个物理网络接口(例如以太网)来同时传输多个TCP数据流。
2.1,三次握手过程
下表展示了简单的三次握手过程。对照表左侧的事件传递来看一下右图。
事件 | 图 |
---|---|
SYN
消息和ACK
消息由TCP头部的SYN bit
或ACK bit
表示。SYN-ACK
消息由SYN bit
和ACK bit
两个比特共同表示,同为“1”
。TCP根据消息中SYN bit
和ACK bit
两个比特的值就会知道TCP socket
处于何种状态(打开,同步,建立)。
下图是三次握手过程1示意图。
其中涉及信息交换过程中的序号同步问题,即SN2( Sequence Number),数值最大可为4,294,967,295
。
3,TCP四次挥手
TCP利用四次挥手(一对两次握手)的方法通过IP协议结束TCP/IP 连接。发送标记FIN bit
(FIN是finish
的大写缩写)的消息,表示发送方想要结束连接,标志着发送方不能再发送消息,但是可以接收消息直到对端决定不再发送消息。所以这也是为什么结束过程不像连接过程一样是三次握手。如果是"FIN,ACK-FIN,ACK"
,最后的ACK
消息是不能由申请结束的设备来发送的,因为是该设备已经发送了FIN
消息,不能再发送消息了。只有双方都发送了FIN bit
和ACK bit
消息才被认为连接结束,否则不是。正常结束通信的双方,它们状态改变是不同的。
2.1 ,四次挥手过程
如下图所示是四次挥手过程3示意图。
客户端应用程序首先发起结束连接的请求消息给服务端,等待确认,服务端接收结束标志,发送确认消息给客户端,并告知自身应用程序关闭连接;服务端程序准备关闭,发送结束连接的消息给客户端,并等待客户端的确认,客户端接收结束消息,发送确认给服务端,服务端接收确认消息,服务端关闭连接,客户端等待2倍的MSL时间,客户端关闭连接。