tcp三次次握手
标志位(比特)说明
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报文段分割长度
握手细节
- 客户端发送SYN包来建立连接。包信息:
[SYN=1,ACK=0] Seq=1000(随机生成的初始序号client_isn,目前假设1000);Len=0;MSS=1460(通常情况下是1460);
- 服务端收到包之后,提取SYN的报文信息,然后分配TCP缓存和变量,发送允许连接的报文段。包信息
[SYN=1,ACK=1] Seq=666(随机生成的初始序号server_isn,目前假设535);Ack=1000(上一个包的Seq)+1;Len=0;MSS=1200(这个不是固定的,根据当前窗口来判断能接受的最大报文段长度)
。在第三次握手之前分配缓存容易收到SYN洪泛的拒绝服务攻击 - 客户端接受到服务端的确认包之后,发送确认包
[ACK=1,SYN=0] Seq=1001(上一个包的Ack), Ack=666(上一个包的Seq)+1;
之后就可以正常通信了。前两次不能有效负载,第三次就可以携带客户数据了。然后后面在通信的时候标志位都将置为0
上述过程在wireshark中是这么展示的
切记
- 看到有些文章里面用SYN=x来作为第一次握手,这个很明显是非常错误的,在报文信息中SYN和ACK只能是标志位,标志位的值只有0和1,而且它的值和Ack,Seq在报文中的位置参考下图2
- ACK和Ack的区别,ACK是报文的标志位,Ack是包内的确认号,他们之间的关系可以理解为,我给你了一个钱包, 这个"钱"就是这个包的标志,标示我给的不是书包,也不是背包,而钱包里面有100块钱和2张银行卡,这里的100块钱其实就是钱包内的内容就是Ack,而钱包的"钱"是ACK这个标志,这篇文章可以帮你加深印象
- wireshark中的Seq是0开始的,其实是因为wireshark中的Seq是Relative Sequence Number(相对序号) 【可以参考下图1】,这个是为了方便调试用的
- 这个里面介绍的很好TCP协议小节 但是里面对WS的讲解不对,是按照滑动窗口Window size来描述了,Window size在包中对应的是Win这个字段,而WS是窗口因子,用来商议下一次发送包的时候的放大倍数,这个跟tcp的流量控制有关
- 还有在最后一次握手的时候Seq的信息应该是第二次握手的Ack值,有些文章里面认为这个Seq也是随机生成的,其实不是,Seq 是Sequence Number是发送包的序号,握手初期会随机生成一个来作为标记,但是在握手成功之后它不仅是标记还是下一个报文段的起始序号,这个是因为TCP发送数据的时候是分段发送的,根据窗口,流量,拥塞来决定每一个段的大小,所以从第三次握手开始Seq其实就是有规律的了,客户端接受到的Seq应该是上一次的Seq+Len(分割段长度),第三次握手为什么会Seq等于上一次的Ack而上一次的Ack其实就是第一次的Seq+1+Len,而Len一直都为0,所以第三次握手之后,开始通信的时候报文序号应该从相对序号1开始,也就是报文的起始位置
计算机网络中的三次握手
补充一下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。