TCP报文格式
-
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息(例如:IP,Port…)
-
报文主要段的意思
序号(sn):表示发送的数据字节流,确保TCP传输有序,对每个字节编号
确认序号(asn):发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
FIN:结束标志,用于释放连接,为1表示关闭本方数据流
我在这里把序号叫做Sequence Number,简写sn
确认序号叫做Acknowledgment Sequence Number,简写asn
第一阶段:客户端发起连接阶段
客户端发起连接请求,将SYN置为1, 同时发送序列号sn为x(x 是随机生成的一个 int 数值), 然后客户端进入SYN_SEND状态,等待服务器的确认,
总之: client 发送的数据包:SYN=1;sn=x
状态:SYN_SEND
第二阶段:服务器确认收到请求
服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Sequence Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为 y (y 是随机生存的一个 int 数值);服务器端将上述所有信息放到一个报文段中,一并发送给客户端,此时服务器进入SYN_RECV状态
总之:server发送的数据包, SYN=1;ACK=1;asn=x+1;sn=y
状态:SYN_RECV
第三阶段:客户端确认收到,发送确认信息
客户端收到报文后,需要对报文段进行确认,所以ACK标志位为1,设置Acknowledgment Sequence Number为y+1;这个时候,不是发起连接请求,不必要对SYN标志位置为1;同时发送自己的序列号sn=x+1
总之:server发送的数据包, ACK=1;asn=y+1;sn=x+1
状态:ESTABLISHED
三次握手过程分析:
- 第一次:客户端发送请求到服务器,服务器知道客户端发送,自己接收正常。客户端没法知道自己的状态。SYN=1,seq=x
- 客户端:没法知道自己发送和接收是否正常,也没法知道服务器是否发送接收正常
- 服务器:知道客户端发送正常,知道自己接收正常。
- 第二次:服务器发给客户端,客户端知道自己发送、接收正常,服务器知道自己接收正常。ACK=1,ack=x+1,SYN=1,seq=y
- 客户端:知道自己发送和接收都正常了,知道服务器发送接收都正常了
- 服务器:知道客户端发送正常,知道自己接收正常
- 第三次:客户端发给服务器:服务器知道客户端发送,接收正常,自己接收,发送也正常.seq=x+1,ACK=1,ack=y+1
- 客户端:知道自己发送和接收都正常了,知道服务器发送接收都正常了
- 服务器:知道客户端发送接收都正常了,知道自己发送了接收都正常了
上面分析过程可以看出,握手两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论的。