目录
1. 三次握手详情
2. 为什么需要三次握手才能建立连接
3. 首次握手的隐患 ---SYN 超时的问题
4. 建立连接之后, Client 出现故障
四, TCP 三次握手
1. 三次握手详情
(1)一开始, 客户端和服务器端都处于关闭状态(CLOSED), 然后开启服务, 服务端这个时候处于监听状态(LISTEN).
(2)客户端发送一个连接请求报文, 里面 SYN 等于 1,seq 可以使任意一个整数, 标明这个报文段的序号. 这个报文段不能传输数据. 此时客户端进入同步状态(SYN-SENT).
(3)服务端同意连接则发送一个报文段, 里面 SYN=1,ACK=1,seq=y,ack=x+1. 大写字母是标志位 ACK=1 表示确认号 (ack) 有效, 这里 ack 确认上一个服务器发送过来的 seq 为 x 的已经接受, 确认下一个接收的编号为 x+1, 同时发送的报文段的序号为 y. 此时的报文段不能发送数据. 服务端进入同步状态(SYN-RCVD).
(4)客户端接收服务端报文段之后, 回复一个报文段, 里面 ACK=1,seq=x+1,ack=y+1.ack 确认服务器端的 y 编号的数据已经接受, 请求 ack=y+1 的字段, 此时客户端的报文段编号为 x+1. 此时可以发送数据, 也可以不发送. 客户端进入已建立连接状态(ESTAB-LISHED).
(5)服务端接收之后进入已连接状态(ESTAB-LISHED)
2. 为什么需要三次握手才能建立连接
主要是初始化 Sequence Number 的初始值
3. 首次握手的隐患 ---SYN 超时的问题
问题分析: Server 收到 Client 的 SYN, 回复 SYN-ACK 的时候未收到 ACK 确认
服务端解决方法: Server 不断地重试直至超时, Linux 系统中超时时间是 63 秒, 即重试五次之后关闭连接 1,2,4,8,16,32, 第五次重试之后等待 32 秒后关闭.
SYN Flood 攻击: 即不断的使服务端进入同步状态, 使服务器的端口不可用, 浪费掉
解决方法: 设置一个 SYN 队列, 当 SYN 队列满了之后, 服务器则会通过 tcp_syncookies 参数回发一个 SYN Cookie, 如果客户端连接正常则会回发 SYN Cookie, 直到建立连接
4. 建立连接之后, Client 出现故障
连接具有保活机制, 向对方发送保活探测报文, 如果未收到响应则继续发送, 常识次数达到保活探测数任未收到响应即终止连接.
计算机网络(四),TCP 三次握手
来源: http://www.bubuko.com/infodetail-2946659.html