一般面试网络,程序员基本都会问到关于三次握手,四次握手。
四次握手下次讲解。
本人经历好几次面试都被问到,一直没有认真搞明白,这次全面查阅书籍与对比博客进行了一下总结,希望看官仔细看完后能得到收获。
1. TCP报文首部格式
2. 格式字段解释
源端口: 应用进程的源端口。自身端口,比如是 64531。 16位,所以端口号只能 0~65535
目的端口: 目标主机的端口号。同样是16位。
序号:(序列号 Sequence Number)一般简称seq。字段长度32位。当值大于2的32次方时,归0.
确认号:(ACK确认序号 Acknowledgement Number)一般简称ack。注意是小写。以免以下面的ACK标记位冲突。期望收到对方下一个报文段的第一个数据字段的序号。
标记位(Flag)6 个
URG: (紧急)紧急有效,需要快速重传
ACK:(确认)连接后的报文回应,ACK为1
PSH:(推送)接收方应该尽快将这个报文交给上层的协议,无需等待存满。
RST:(复位)重新连接
SYN:(同步)发送连接
FIN:(终止)释放连接
3. TCP建立连接
第一次握手
客户A 发送一个同步标记SYN=1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number)ISN是一个随时间变化的随机值,即SYN=1,seq=x. 此时客户A 进入 SYN-SENT 状态
第二次握手
服务器接收到SYN包后发回确认报文。数据报文标记位 ACK=1,同时确认序号(ack) 表明客户A期待收到服务器下一个数据段的序号,即ack=x+1 (前一个数据段已收到且没有错误)
此外,设置标记位SYN=1,和服务器的初始序号y。即 SYN=1,seq=y.
此时服务器B进入 SYN-RCVD 状态,
客户A进入 ESTABLISHED 状态
第三次握手
客户A回送一个确认数据段。
标记位ACK=1. seq=x+1(第一次握手自己的x即seq) , ack=y+1 (服务器B的序列号y)
接下来就是相互收发数据了。
握手阶段:
序号 | 方向 | seq | ack | SYN | ACK |
---|---|---|---|---|---|
1 | A->B | 10000(x) | 0 | 1 | 0 |
2 | B->A | 20000 (y) | 10001=10000+1 (ack=x+1) | 1 | 1 |
3 | A->B | 10001 (x=x+1) | 20001=20000+1 (ack=y+1) | 0 | 1 |
希望以上知识可以带来一些帮助,如有任何疑问,请加群641792143交流与学习 或关注微信公众号 程序员干货区
闻道有先后,术业有专攻,希望大家不吝赐教
下面是公众号二维码