@AlexWuYh
2019-10-31T09:07:36.000000Z
字数 1792
阅读 76
TCP/IP
connect()
时,触发三次握手.
第一次握手 (SYN=1, seq=x):
客户端发送一个TCP的包, SYN 标志位 为1. 设置服务器端口,初始序号 x, 保存在包头的序列号(Sequence Number)字段.
发送完毕后, 客户端进入 `SYN_SEND` 状态.
第二次握手 (SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答, SYN标志位 和 ACK标志位 均为1. 服务器端选择自己的 ISN 序列号, 放到 Seq域里.
同时,将确认序号(Acknowledgement Number)设置为客户的 ISN 加 1 (x+1).
发送完毕后,服务器端进入 `SYN_RCVD` 状态.
第三次握手 (ACK=1, ACKnum=y+1):
客户端再次发送确认包(ACK), SYN 标志位 为0, ACK 标志位 为1. 把服务器发来的 ACK 的序号字段 加 1 (y+1).
放在确定字段中发送给对方, 在数据段放写 ISN+1.
发送完毕后,客户端进入 `ESTABLISHED` 状态.
当服务器端接收到这个包时,也进入 `ESTABLISHED` 状态, TCP握手结束.
close()
时,触发挥手操作.
第一次挥手 (FIN=1, seq=x):
客户端关闭连接, 发送一个 FIN 标志位 为1 的包,表示没有数据要发送了,但可以接收数据.
发送完毕后,客户端进入 `FIN_WAIT_1` 状态.
第二次挥手 (ACK=1, ACKnum=x+1):
服务器端确认客户端的 FIN 包,发送一个确认包, 表明接收了关闭连接的请求,但还没准备好关闭连接.
发送完毕后,服务器进入 `CLOSE_WAIT` 状态.
客户端接收到这个确认包, 进入 `FIN_WAIT_2` 等待服务器关闭连接.
第三次挥手 (FIN=1, seq=y):
服务器准备好关闭连接时,向客户端发送结束连接请求, FIN 标志位 为1.
发送完毕后,服务器进入 `LAST_ACK` 状态,等待来自客户端的的最后一个ACK.
第四次挥手 (ACK=1, ACKnum=y+1):
客户端接收到关闭请求,发送一个确认包,进入 `TIME_WAIT` 状态,等待可能出现的要求重传的ACK包.
服务器接收到确认包,关闭连接,进入 `CLOSED` 状态.
客户端等待了某个固定的时间 (2*最大段生命周期, 2*MSL, 2 Maximum Segment Lifetime) 之后,
没有收到服务器的ACK,认为服务器已正常关闭,自己也关闭连接,进入 `CLOSED` 状态.