3次握手
-
客户端与服务器通信前需要经历3次握手建立连接。
1、第1次握手客户端告诉服务器我想建立连接
2、第2次握手是服务器收到连接请求后告诉客户端同意连接
3、第3次握手是客户端告诉服务器确认建立连接。
状态解读
-
CLOSED: client处于关闭状态
-
LISTEN: server处于监听状态,等待client连接
-
SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后, 它会进入到ESTABLISHED状态
-
SYN-SENT: 表示client已发送SYN报文,等待server的第2次握手
-
ESTABLISHED:表示连接已经建立
前两次握手的特点
-
SYN都设置为1
-
数据部分的长度都为0
-
TCP头部的长度一般是32字节
1.固定头部: 20字节
2.选项部分: 12字节 -
双方会交换确认一些信息
1.比如MSS、是否支持SACK、Window scale (窗口缩放系数)等
2.这些数据都放在了TCP头部的选项部分中(12字节)
疑问
-
为什么建立连接的时候,要进行3次握手? 2次不行么?
主要目的:防止server端一直等待,浪费资源 -
如果建立连接只需要2次握手,可能会出现的情况
1.假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server
2.本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发 出的一个新的连接请求
3.于是server就向client发出确认报文段,同意建立连接
4.如果不采用“3次握手”, 那么只要server发出确认,新的连接就建立了小
5.由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据
6.但server却以为新的连接已经建立,并一直等待client发来数据,这样, server的很多资源就白白浪费掉了 -
采用“三次握手”的办法可以防止上述现象发生
例如_上述情况,client没有向server的确认发出确认,server由于收不到确认, 就知道client并没有要求建立连接 -
第3次握手失败了,会怎么处理?
1.此时server的状态为SYN-RCVD,若等不到client的ACK, server会重新发送SYN+ ACK包
2.如果server多次重发SYN+ ACK都等不到client的ACK,就会发送RST包,强制关闭连接
网友评论