tcp/ip原理/三次握手/四次挥手
@ tcp/ip原理
1.1 tcp/ip三次握手
1.1.1 建立过程说明
a) 由主机A发送建立TCP连接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中SYN字段置为1, 表示需要建立TCP连接。
b) 主机B会回复A发送的TCP连接请求报文, 其中包含seq序列号, 是由回复端随机生成的, 并且将回复报文的SYN字段置为1, 而且会产生ACK字段, ACK字段数值是在A发过来的seq序列号基础上加1进行回复,以便A收到信息时, 知晓自己的TCP建立请求已得到了验证。
c) A端收到B端发送的TCP建立验证请求后, 会使自己的序列号加1表示, 并且再次回复ACK验证请求, 在B端发送过来的seq基础上加1, 进行回复。
1.1.2 简述说明
- 在最开始, 客户端和服务器都处于CLOSED状态。
- 服务器会创建socket文件开始监听, 服务器状态处于LISTEN。
- 客户端向服务器发送SYN, 请求建立连接, 发完之后自己的状态变为SYN_SENT。
- 服务器收到客户端发来的SYN, 然后会回复ACK和SYN, 发完之后自己的状态变为SYN_RECV
- 客户端收到服务器发来的SYN和ACK之后会马上回复ACK, 回复完之后状态变为ESTABLISHED。
- 服务器端收到客户端发来的ACK之后会直接进入ESTABLISHED
至此, 三次握手完成, 连接建立。
1.2 tcp/ip 四次挥手
1.2.1 断开过程说明
a) 主机A发送断开TCP连接请求的报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中FIN字段置为1, 表示需要断开TCP连接。
b) 主机B会回复A发送的TCP断开请求报文, 其中包含seq序列号, 是由回复端随机生成的, 而且会产生ACK字段, ACK字段数值, 是在A发过来的seq序列号基础上加1进行回复, 以便A收到信息时, 知晓自己的TCP断开请求已得到了验证。
c) 主机B在回复完A的TCP断开请求后, 不会马上就进行TCP连接的断开, 主机B会先确保断开前, 所有传输到A的数据是否已经传输完毕, 一旦确认传输数据完毕就会将回复报文的FIN字段置为1, 并产生随机seq序列号。
d) 主机A收到主机B的TCP断开请求后, 会回复主机B的断开请求, 包含随机生成的seq字段和ack字段, ack字段会在主机B的TCP断开请求的seq基础上加1, 从而完成主机B请求的验证回复。
1.2.2 简述说明
- 客户端发送一个FIN并进入FIN_WAIT_1状态, 并包括一个序号X。
- 服务端接收到客户端发送的FIN, 然后回复ACK确认号X+1和已方的序号Y给客户端, 此时服务端进入CLOSE_WAIT状态, 客户端收到服务端的ACK后, 进入FIN_WAIT_2状态。
- 服务端发送一个FIN给客户端, 包括ACK确认号X+1和已方的一个序号Y, 并进入LAST_ACK状态。
- 客户端收到服务端发送的FIN, 然后回复ACK确认号Y+1和已方的序号X+1给服务端, 此时客户端进入TIME_WAIT状态, 经过2MSL时间后关闭连接, 服务端收到客户端的ACK后, 关闭连接。
1.3 tcp/ip状态集
1.3.1 十一种状态集介绍
Status |
Description |
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