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消息才被认为连接结束,否则不是。正常结束通信的双方,它们状态改变是不同的。
3.1 ,四次挥手过程
如下图所示是四次挥手过程3示意图。
客户端应用程序首先发起结束连接的请求消息给服务端,等待确认,服务端接收结束标志,发送确认消息给客户端,并告知自身应用程序关闭连接;服务端程序准备关闭,发送结束连接的消息给客户端,并等待客户端的确认,客户端接收结束消息,发送确认给服务端,服务端接收确认消息,服务端关闭连接,客户端等待2倍的MSL时间,客户端关闭连接。
http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm ↩︎
http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentSequenceNumberSynchroniz-2.htm ↩︎
http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm ↩︎