一、综合图示
二、Wireshark抓包
第一次握手
源IP:192.168.1.4
目标IP:120.232.32.89
SYN=1,seq=0(x)
第二次握手
源IP:120.232.32.89
目标IP:192.168.1.4
SYN=1,ACK=1,seq=0(y),ack=0+1(x+1)
第三次握手
源IP:192.168.1.4
目标IP:120.232.32.89
ACK=1,seq=0+1=1(x+1),ack=0+1=1(y+1)
三、分部图解
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
第三次握手:
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1。
四、拓展
1、为什么要三次握手
TCP的连接因为是全双工的,也就是Client和Server两端,发送消息两个方向的连接都要建立成功。如果要保证双向连接都成功的话,三次通信是最少的次数了。大于三次的话,后面的次数通信就没有必要了,是在浪费资源。
2、三次握手失败了会怎么样
这里要看是在那个阶段失败的,Client在发送SYN之后没有收到ACK消息,Client会进行重传,第一次重传时间5.5-6s之间,第二次重传会是24s,不成功还会继续尝试,伯克利系统在超过75s之后,如果还是不成功,会放弃尝试连接。如果Server没有收到最后的一次Ack消息,同样的原理,Server也会进行重传第二步的Syn+Ack消息。
3、三次握手的状态转换
TCP的状态变化图如下所示,客户端和服务器的初始状态都是CLOSED状态
客户端:CLOSED-----发送Syn 消息--->SYN_SENT-----收到Server端发回的SYN+ACK--->ESTABLISHED---发送和接收数据-->......
服务器:CLOSED----收到Client端发送过来的SYN消息-->SYN_RCVD-----发送SYN+ACK消息--->SYN_RCVD----收到Client发回来的ACK消息--->ESTABLISHED-----发送和接收数据-->......