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