标题:[浅显易懂]和TCP三次握手相关的TCP报文中的重要标志位 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Wed, 10 Jan 2018 20:49:43 +0000 作者:jackxiang 地址:https://jackxiang.com/post/9594/ 内容: 看了很多tcp文章都看不懂,这篇文章好像懂了,有空试试,说的是不是真的。 和三次握手相关的TCP报文中的重要标志位 昨天的文章中,结合Wireshark抓包和大家讨论了三次握手的相关知识点,评论中有些读者对序号,确认序号,以及SYN&ACK等标志位还有一些疑问,这里简单再说一下我的理解。其中ACK的32位值在Wireshark抓包时显示的是相对的值,可设置为显示真实值:http://mini.eastday.com/a/180131063435528.html 首先,由TCP协议报文的格式可知,在报文中我们主要关注与《32位序列号》,《32位确认序号》,和SYN和ACK标志位。因为这四个要素和三次握手紧密相关。 点击在新窗口中浏览此图片 https://jackxiang.com/attachment.php?fid=485 #32位序列号(后面简写为seq): 就是我们常说的序号。对于要发送的数据的第一个序号而言这个序号是通过一个算法计算得到seq。这就是告诉接收方:我发送的数据是从seq开始的。 TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收,当某个主机开启一个TCP会话时,他的初始序列号是随机的。 比如,源端发送(SYN=1 , seq=X)到服务端,代表的意思是,我这是个SYN包,我请求对你的连接(SYN包置1代表这是一个连接请求),seq代表这个包的序号。 这个对应三次握手的第一次握手。 点击在新窗口中浏览此图片 https://jackxiang.com/attachment.php?fid=486 #32位确认序列号(后面简写为ack): 就是告诉接收方,我已经接受到了你的数据包。 比如服务端发送一个(SYN=1,ACK=1,seq=Y, ack=X+1) SYN和ACK代表这是一个确认连接的TCP包,seq=Y为服务端为该报文生成的一个随机数,而ack(确认序号)则通知客户端我已经接受到了你的上一次报文(X),我希望下次接受你的报文的seq=X+1. 注意这里大写的ACK指代的是ACK标志位,而小写的ack则指示的是确认序号。 这步对应三次握手的第二次握手。 点击在新窗口中浏览此图片 https://jackxiang.com/attachment.php?fid=487 #而当客户端接受到服务端的TCP报文之后,客户端需要发送(ACK=1,seq=X+1,ack=Y+1)报文给服务端进行确认。该报文表示的意思是: 这是一个确认报文,因为上次我产生的报文seq=X,这次的报文顺序加1,所以seq=X+1(其实服务端期待的seq在第二次握手的时候已经通过ack告知了客户端),ack=Y+1则代表客户端告诉服务端,我已经接受到了你的seq=Y的TCP报文,我希望下一次能收到你的seq=Y+1的TCP报文。 注意这里大写的ACK指代的是ACK标志位,而小写的ack则指示的是确认序号。 这步对应三次握手的第三次握手 点击在新窗口中浏览此图片 https://jackxiang.com/attachment.php?fid=488 #其实总结起来 Seq也好,ack也好,都是数据包的序号,可以用这两个序号来跟踪两端发送的数据包。Seq是用来标志特定的数据包的,而ack则是接收方对发送方的一次确认,告知我已收到某某seq的报文了。而至于SYN和ACK标志位,小编的理解SYN置1就代表这是一个连接请求,而ACK置1表明这是一个确认的数据包。 每天学习一点点,每天进步一点点,希望大家持续关注本号,共同学习,共同提高,在IT的世界里包括各种协议,云计算,Linux等相关领域遨游沟通。明日的主题和大家一起讨论一下HTTP Rest协议的简单理解。 【【生先生谈IT】和TCP三次握手相关的TCP报文中的重要标志位】https://m.toutiao.com/group/6509068569572016648/?iid=22420291970&app=news_article×tamp=1515586769&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share Generated by Jackxiang's Bo-blog 2.1.1 Release