image.png

    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包,强制关闭连接**