本文共 2521 字,大约阅读时间需要 8 分钟。
设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接受客户端进程的连续请求,然后服务进程就处于监听状态,不断检测是否有客户进程发起连续请求,如果有,做出响应。
设客户进程运行在主机A上,先向自己的TCP发出主动打开的命令,表明要向某个IP地址的某个端口建立运输连接
1) 主机A的TCP向主机B的TCP发出连接请求报文段,首部的同步为SYN置为1,并选择一个序列号X,表示后面要传输的第一个数据字节的序号是X。发送之后进入SYN_SENT状态
2)主机B接受到该请求报文段,如果确认建立连接,就向客户端发送一个确认报文段,置首部的同步位SYN为1,确认号为X+1,并自己选一个序列号Y,发送之后进入SYN_RCVD状态
3) 客户端收到该确认报文段,还要给服务器继续发送确认报文段,确认号为y+1,并且进入ESTABLISHED状态
4) 服务端收到确认报文段后进入ESTABLISHED状态,双方通知上层应用进程里连接已经建立,开始传输数据
1) 客户端A的应用进程通知TCP要终止连接,并且不再传输数据。客户端A通知服务器B要释放连接,发送的TCP报文段的首部终止比特位FIN置为1,序列号seq为传输的最后一个字节的序号+1 发送之后进入FIN_WAIT-1状态
2) 服务端B收到该请求后,发出确认,确认报文段的确认号为u+1,并选择一个序列号V。通知上层应用A到B的连接需要释放,连接处于半关闭状态,即服务器B不再接受来自客户端A的数据,但是还是需要向A发送数据,如果A正确接受仍需要发送确认。此时的状态是CLOSE_WAIT
3) 此时客户端处于FIN_WAIT-2状态 在接受服务端发送的剩余数据。
3) 服务器B发送完数据后,应用程序就开始等待TCP释放连接。此时服务器B向客户端发送连接释放报文段,首部的终止位FIN置为1,确定号仍然是u+1,并且就选择一个序列号w,进入LAST_ACK状态
4) 客户端A接受到该报文段后,向服务端发送确认报文段,确认号是w+1,序列号仍然是u+1,进入TIME_WAIT状态。这样才把B到A的反方向连接释放掉。等待2MSL关闭TCP连接
5) 服务器B收到确认报文段后关闭TCP连接
三次握手建立连接时,发送方再次发送确认的必要性
四次挥手释放连接时,等待2MSL的意义
连接的建立和释放所要求的步骤可以用一个有限状态机来表达,该状态机有11种状态。每一种状态中都存在一些合法的事件,当合法事件发生的时候,可能需要采取某个动作。当其他事件发生的时候,则报告一个错误。
状态 | 描述 |
---|---|
CLOSED | 关闭状态,没有连接活动或正在运行 |
LISTEN | 监听状态,服务器正在等待连接进入 |
SYN SENT | 已经发送连接请求 等待确认 |
SYN RCVD | 收到一个连接请求 尚未确认 |
ESTABLISHED | 建立连接 正常数据传输状态 |
FIN_WAIT 1 | (主动关闭) 已经发送关闭请求 等待确认 |
CLOSE WAIT | (被动关闭) 收到对方关闭请求 已经确认 |
FIN_WAIT 2 | (主动关闭) 收到对方关闭确认 等待对方关闭请求 |
LAST ACK | (被动关闭) 等待最后一个关闭确认 并等待所有分组死掉 |
TIME_WAITED | 完成双向关闭 等待所有文组死掉 |
CLOSING | 双方同时尝试关闭 等待对方确认 |
客户进程变迁的过程(粗实线)
服务器进程变迁的过程(粗虚线)
转载地址:http://shqli.baihongyu.com/