TCP的三次握手

要理解tcp连接建立(三次握手)的过程,必须要知道tcp报文中的SYN,ACK,seq,ack的含义。
TCP的三次握手_第1张图片

tcp报文格式

SYN:6个控制位之一,在 连接建立时用来同步序号。SYN置为1表示这是一个请求连接或者连接接受报文。直白讲,SYN只有在请求连接和接受连接用得到,置为1就行了。
ACK:6个控制位之一,当ACK=1时表示确认,ACK=0反之。(TCP规定,在连接建立后所有传送的报文ACK位必须置1)
seq(32位序号):4字节,表示 本报文段所发送的数据的第一个字节的序号。(TCP传输的字节流中每一个字节都是有序号的)
ack(32位确认号):4字节, 期望对方发送的下一个报文段的第一个数据字节的序号。(比如说,我现在收到一个seq=x,数据长度为y的报文,那我给你回信当然是要你下一个报文发送的数据从x+y-1开始发送,即你的下一个报文seq=x+y-1)

TCP的三次握手_第2张图片

TCP三次握手的过程
下面是我的解释,首先还得介绍两条规定:
  • TCP规定:SYN=1的报文段(请求连接或者确认连接报文段)不能携带数据,但要消耗一个序号(seq)。
  • TCP规定:ACK报文段(SYN=0)可以携带数据。如果不携带则不消耗序号。(比如我这次发的报文没有携带数据,seq=k,那么我下次发的报文seq还是k)。
  1. 客户端请求连接:因为是请求连接,SYN=1;(不是同意连接,ACK=0);初始序号设置为x(seq=x)。
  2. 服务器同意连接:因为是同意连接,SYN=1;因为是确认,ACK=1;服务器为自己发送的数据设置初始序号y(seq=y);因为服务器接收请求连接报文中seq=x,且SYN=1的报文必须消耗一个序号,所以服务器认为客户端下一个报文的seq要为x+1,所以ack=x+1。
  3. 客户端确认连接:(既不是请求连接,也不是确认连接,SYN=0);根据第二条规定,ACK=1;服务器要我从x+1发数据,那seq=x+1;根据规定一,服务器下一次给我发的数据要从y+1开始,所以ack=y+1。
SYN ACK seq ack
客户端请求连接 1 (0) x
服务器同意连接 1 1 y x+1
客户端确认连接 0 1 x+1 y+1

你可能感兴趣的:(计算机网络)