TCP的三次握手(建立链接)
1.第一次握手:主机A向主机B申请TCP链接,其中包含主机A的初始序列号seq(主机A)=x(随机),其中报文中同步标志位SYN=1,ACK=0,表示TCP的链接请求的数据报文,序号seq(主机A)=x,(表明传输数据时的第一个字节的序号是x)
2第二次握手:主机B收到主机A的链接申请后会发回一个链接确认数据包,此时SYN=1,ACK=1,且包含主机B的初始序列号seq(主机B)=y(随机)及主机B对主机A初始序列号的确认号(ack(B)=seq(A)=x+1)
第三次握手:主机A收到确认后,还要向主机B给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,主机A进入已建立连接状态。TCP规定,ACK报文段可以携带数据,当主机B收到主机A的确认后也进入已连接状态,此后双方就可以通信了
TCP是双向的所以最开始的时候两台主机都是处于未开放状态,所以两台主机可以是发送方又可以是接收方
总结:
第一次握手:
主机A要建立链接所以SYN=1,seq=x(随机)因为还没有建立链接且没有数据所以是随机的
第二次握手:
主机B同意连结所以SYN=1
链接建立所以ACK都必须为1
seq=y(随机)因为双方刚刚建立链接还没有数据
ack(B)=seq(A)=x+1,主机B接收到的序列号虽然是随机的但是主机B要的是x=1位数据
第三次握手:
SYN=0:SYN只有在建立连接时才为1,其他时候均设为0
ACK=1:链接建立所以ACK都必须为1
seq=x+1:主机A发送的报文段的第一个字节就是x+1
ack=y+1:主机B发送的是第y(x+1)位数据,所以主机A要的是y+1位数据