TCP/IP-三次握手

tcp三次次握手

TCP/IP-三次握手_第1张图片

标志位(比特)说明
    SYN 用来发起建立连接的请求
    ACK 用来确认字段中的值是有效的
    PSH 指示接收方应该立刻将数据交给上层
    URG 指示报文中存在着被发送端的上层实体设置为紧急的数据
    RST 用来终止程序并且不需要确认
    FIN 用来发起断开连接的请求
关键符号描述
    Ack Acknowledgment Number 确认号,与ACK不同,切记中会详细说明
    Seq Sequence Number 报文序号
    MSS: Maximum Segment Size 最大报文段长度, 以太网和PPP链路层都具有1500的MTU(Maximum Transmission Unit),在报文中首部信息一般占用40个字节, 一般初始化为1460
    Win: 在tcp包中告诉对方当前接受窗口大小
    WS(Window Scale):  窗口因子
    Len: TCP Segment length tcp报文段分割长度
握手细节
  1. 客户端发送SYN包来建立连接。包信息: [SYN=1,ACK=0] Seq=1000(随机生成的初始序号client_isn,目前假设1000);Len=0;MSS=1460(通常情况下是1460);
  2. 服务端收到包之后,提取SYN的报文信息,然后分配TCP缓存和变量,发送允许连接的报文段。包信息 [SYN=1,ACK=1] Seq=666(随机生成的初始序号server_isn,目前假设535);Ack=1000(上一个包的Seq)+1;Len=0;MSS=1200(这个不是固定的,根据当前窗口来判断能接受的最大报文段长度)。在第三次握手之前分配缓存容易收到SYN洪泛的拒绝服务攻击
  3. 客户端接受到服务端的确认包之后,发送确认包[ACK=1,SYN=0] Seq=1001(上一个包的Ack), Ack=666(上一个包的Seq)+1; 之后就可以正常通信了。前两次不能有效负载,第三次就可以携带客户数据了。然后后面在通信的时候标志位都将置为0

上述过程在wireshark中是这么展示的

切记
  1. 看到有些文章里面用SYN=x来作为第一次握手,这个很明显是非常错误的,在报文信息中SYN和ACK只能是标志位,标志位的值只有0和1,而且它的值和Ack,Seq在报文中的位置参考下图2
  2. ACK和Ack的区别,ACK是报文的标志位,Ack是包内的确认号,他们之间的关系可以理解为,我给你了一个钱包, 这个"钱"就是这个包的标志,标示我给的不是书包,也不是背包,而钱包里面有100块钱和2张银行卡,这里的100块钱其实就是钱包内的内容就是Ack,而钱包的"钱"是ACK这个标志,这篇文章可以帮你加深印象
  3. wireshark中的Seq是0开始的,其实是因为wireshark中的Seq是Relative Sequence Number(相对序号) 【可以参考下图1】,这个是为了方便调试用的
  4. 这个里面介绍的很好TCP协议小节 但是里面对WS的讲解不对,是按照滑动窗口Window size来描述了,Window size在包中对应的是Win这个字段,而WS是窗口因子,用来商议下一次发送包的时候的放大倍数,这个跟tcp的流量控制有关
  5. 还有在最后一次握手的时候Seq的信息应该是第二次握手的Ack值,有些文章里面认为这个Seq也是随机生成的,其实不是,Seq 是Sequence Number是发送包的序号,握手初期会随机生成一个来作为标记,但是在握手成功之后它不仅是标记还是下一个报文段的起始序号,这个是因为TCP发送数据的时候是分段发送的,根据窗口,流量,拥塞来决定每一个段的大小,所以从第三次握手开始Seq其实就是有规律的了,客户端接受到的Seq应该是上一次的Seq+Len(分割段长度),第三次握手为什么会Seq等于上一次的Ack而上一次的Ack其实就是第一次的Seq+1+Len,而Len一直都为0,所以第三次握手之后,开始通信的时候报文序号应该从相对序号1开始,也就是报文的起始位置

TCP/IP-三次握手_第2张图片

TCP/IP-三次握手_第3张图片

计算机网络中的三次握手

TCP/IP-三次握手_第4张图片

补充一下

TCP/IP-三次握手_第5张图片

你可能感兴趣的:(javascript,前端,tcp-ip)