a) 由主机A发送创建TCP链接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 而且还将报文中SYN字段置为1, 表示须要创建TCP链接。html
b) 主机B会回复A发送的TCP链接请求报文, 其中包含seq序列号, 是由回复端随机生成的, 而且将回复报文的SYN字段置为1, 并且会产生ACK字段, ACK字段数值是在A发过来的seq序列号基础上加1进行回复,以便A收到信息时, 知晓本身的TCP创建请求已获得了验证。linux
c) A端收到B端发送的TCP创建验证请求后, 会使本身的序列号加1表示, 而且再次回复ACK验证请求, 在B端发送过来的seq基础上加1, 进行回复。服务器
至此, 三次握手完成, 链接创建。并发
a) 主机A发送断开TCP链接请求的报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 而且还将报文中FIN字段置为1, 表示须要断开TCP链接。socket
b) 主机B会回复A发送的TCP断开请求报文, 其中包含seq序列号, 是由回复端随机生成的, 并且会产生ACK字段, ACK字段数值, 是在A发过来的seq序列号基础上加1进行回复, 以便A收到信息时, 知晓本身的TCP断开请求已获得了验证。tcp
c) 主机B在回复完A的TCP断开请求后, 不会立刻就进行TCP链接的断开, 主机B会先确保断开前, 全部传输到A的数据是否已经传输完毕, 一旦确认传输数据完毕就会将回复报文的FIN字段置为1, 并产生随机seq序列号。函数
d) 主机A收到主机B的TCP断开请求后, 会回复主机B的断开请求, 包含随机生成的seq字段和ack字段, ack字段会在主机B的TCP断开请求的seq基础上加1, 从而完成主机B请求的验证回复。spa
Statushtm |
Descriptionblog |
LISTEN |
服务启动后首先处于侦听LISTENING状态 |
SYN_SENT |
在发送链接请求后等待匹配的链接请求。经过connect()函数向服务器发出一个同步SYNC信号后进入此状态 |
SYN_RECEIVED |
已经收到并发送同步SYNC信号以后等待确认ACK请求 |
ESTABLISHED |
链接已经创建, 表示2台机器能够相互通讯, 此时链接两端是平等的 |
FIN_WAIT_1 |
主动关闭端调用close()函数发出FIN请求包, 表示本方的数据发送所有结束, 等待TCP链接另外一端的确认包或FIN请求包 |
FIN_WAIT_2 |
主动关闭端在FIN_WAIT_1状态下收到确认包, 进入等待远程TCP的链接终止请求的半关闭状态, 这时能够接收数据, 但再也不发送数据 |
CLOSE_WAIT |
被动关闭端接到FIN后, 就发出ACK以回应FIN请求, 并进入等待本地用户的链接终止请求的半关闭状态, 这时能够发送数据, 但再也不接收数据 |
CLOSING |
在发出FIN后, 又收到对方发来的FIN后, 进入等待对方对链接终止FIN的确认ACK的状态, 少见 |
LAST_ACK |
被动关闭端所有数据发送完成以后, 向主动关闭端发送FIN, 进入等待确认包的状态 |
TIME_WAIT |
主动关闭端接收到FIN后, 就发送ACK包, 等待足够时间(2倍MSL时间)以确保被动关闭端收到了终止请求的确认包 |
CLOSED |
链接关闭, 表明双方无任何链接状态 |
参考连接:
http://www.4e00.com/blog/linux/2016/08/06/tcp-open-and-close.html