建立连接(三次握手):基于C/S模式
客户机A主动与服务器B建立连接:
第一步:客户机A先发送一个请求连接的数据包给服务器B,其中包含同步位SYN=1(只有在请求建立连接的时候才置为1,数据传输的时候置0),发送数据的序列号seq=x(可能不是从1开始,cpu有自己的序列号产生算法),这时候确认标志位ACK置为0,确认位置为0表示确认号ack无效。
第二步:服务器B接收到客户机A发送的数据包后回复一个数据包,其中包含确认收到客户机A发送消息的回复和请求与客户端A建立连接。其中包含确认标志位ACK=1,表示确认号ack有效,ack=x+1表示已经收到序列号为x的数据,下次发送消息从序列号为x+1开始发送(以上是对客户机A的回复)。包含同步位SYN=1表示需要与客户机A建立连接,发送数据的序列号为seq=y. (这一步包含对A的回复和与A建立连接请求)
第三步:客户机A收到服务器B发送的数据包后给服务器B回复确认收到数据包。其中包含ACK=1,表示确认号ack有效。确认号ack=y+1,表示此序列号的消息已经收到,下次发送数据从序列号为y+1开始发送。其中序列号seq=x+1表示此次发送数据的序列号为x+1.
经过以上三步之后TCP连接就已经建立,可以开始数据传输。
释放连接(四次挥手):
第一步:客户机A数据传输完毕向服务器B发送一个结束连接数据包。其中包含结束位FIN=1,表示数据传输已经结束。序号seq=u,表示发送消息的序号为u。客户机A关闭发送窗口,ACK=1,TCP规定在连接建立后所有传送的报文段都必须把ACK置1。
第二步:服务器B收到客户机A发送的结束连接数据包后回复确认消息给客户机A。其中包含确认号ack=u+1,表示已经接收到序号为u的数据包,下次从u+1开始发送。序号seq=v,表示此次数据包的序号为v。这时TCP服务进程通知应用进程关闭与客户机A的接收窗口,从客户机A到服务器B这个方向的连接就释放了,这时的TCP连接处于半关闭状态。服务器B可能还会有未发送完的数据给客户机A,服务器B继续发送,客户机A仍要接收,这种状态可能要持续一段时间。
第三步:当服务器B向客户机A的数据发送完之后,服务器B发送结束连接的数据包给客户机A。其中包含结束位FIN=1,表示数据传输已经结束。服务器B发送数据包的序号seq=w,可能又发送了一些数据给客户机A。服务器B还必须重复已经发送过的确认号ack=u+1.
第四步:当客户机A收到服务器B发送的结束数据包后,回复给服务器B一个确认收到的数据包。其中包含确认ACK=1,确认号ack=w+1表示已经收到发送的序列号为w之前的数据包,期望下一次收到的数据包序列号是w+1。本次数据包的序列号seq=u+1.此时客户机A进入时间等待计时器设置的2MSL(MSL为最长报文段寿命)时间,如果在此时间内没有收到服务器B重发的结束连接数据包,则表示服务器B已经收到客户机A发送的确认消息,TCP连接释放。
(自己理解的tcp连接释放过程,如有错误请批评指出,谢谢!)