美文网首页Java
详解TCP数据包中SYN,ACK字段与数据发送的关联

详解TCP数据包中SYN,ACK字段与数据发送的关联

作者: 望月从良 | 来源:发表于2019-10-05 15:17 被阅读0次

在TCP协议中,为了确保数据能稳定发送,协议使用数据包中的syn,ack两个字段来监控数据是否正确发生和接收,本节我们看看这两个字段如何保证数据的平稳传输。

假设客户端和服务器通过三次握手建立了连接,然后双方准备互相发生数据。假设握手时客户端将自己的syn字段设置为0,而服务器将自己的syn字段设置为240,于是当服务器收到客户端的SYN包后,在返回的ACK+SYN数据包中,它附带的ack字段就会设置为1,也就是说服务器认为客户端下次发送数据时,数据包包含的syn字段应该设置为1。当客户端收到服务器的ACK+SYN数据包后,返回的ACK数据包中会将ACK字段设置为241,也就是说客户端认为服务器下次发送的数据对应的SYN编号为241.

我们假设数据包最大发送字节数为536字节,因此任何一方想发送超过这个长度的数据时,TCP会将数据切分成多个不超过536字节的小块。假设客户端先发起请求,数据包中的数据是140字节,假设客户端和服务器的滑动窗口大小都是361,由于已经发送了140字节的数据,窗口内还剩220字节数据可以发送,于是不等服务器回应,客户端继续将剩下的220字节数据发送给服务器,注意这时候客户端会将数据包中的SYN字段设置为141,如此表明当前数据要跟在上次发送的140字节数据后面,如果包含220字节的数据包比包含140字节的数据包先抵达服务器端,那么服务器就可以通过syn字段得知哪个包的数据在前哪个包的数据在后面。

假设服务器收到了客户端发来的140字节数据包,此时它发送TCP数据包给客户端,其中包含80字节的数据,此时它的syn字段要设置成241,同时ack字段要设置成141,也就是告诉客户端140字节成功收到,让它发送跟着在140字节后面的数据。此时客户端收到服务器回发的数据包,读取syn字段发现其值为141,这时客户端就知道发出的140字节数据服务器已经收到,这时候它就能把自己的移动窗口向后挪动140字节。如果此时客户端没有数据要发送,那么它会回发一个ACK包里面的ack字段设置为321,这相当于告诉服务器80字节的数据收到,请继续发送80字节后面的数据。

接下来服务器继续向客户端发送120字节数据,此时数据包中syn字段设置为321,当客户端收到这个该数据包后,回复ACK包给服务器并且将其中的ack字段设置为321+120=441,告诉服务器120字节的数据成功接收,此时服务器就可以后移窗口120字节。接下来服务器继续发送160字节数据,此时包头的syn字段设置为441,一旦客户端收到数据包后,它会构造一个ACK包,将其中的ack字段设置为441+160=601发回给服务器,告诉它成功接收到数据,当服务器接收到客户端的ACK包后,自己的所有数据都发送完毕,于是连接关闭阶段,整个数据发送过程可由下图表示:

屏幕快照 2019-09-25 下午4.16.35.png 屏幕快照 2019-09-25 下午4.17.16.png

这个过程看起来蛮复杂,实际上TCP协议运行的过程比当前描述要复杂得多,因为它必须处理多种意外情况。上面描述的通讯过程是”一问一答“,事实上客户端可能一下子像服务器发送多个请求,服务器可以一下子回复多个数据包,同时服务器或客户端发送的ACK包中可能还会包含数据等。

其次一个ACK包可以同时回复前面多个数据包。服务器可以同时将120字节和160字节数据包发送给客户端,客户端只要用ack字段为601的ACK包回复给服务器端即可。同时根据双方各自情况还会有”流控制“,也就是一方要求另一方减少或增加一次数据包的数据量从而减缓接收压力或提升接收效率。此外数据包在发送过程中可能会丢失,这时就需要出发重传机制,同时TCP协议还需实时监测是否有网络拥堵,一旦这种情况出现TCP就得启动相应的应对机制等。

TCP协议异常复杂,因为它为了保障数据稳定传输同时还得面对各种意外网络情况,对于其他重要的协议细节,我们会在后续课程中继续介绍。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:


这里写图片描述

相关文章

  • 详解TCP数据包中SYN,ACK字段与数据发送的关联

    在TCP协议中,为了确保数据能稳定发送,协议使用数据包中的syn,ack两个字段来监控数据是否正确发生和接收,本节...

  • TCP

    TCP连接,对端宕机,本端可能无法感知到。 TCP连接,对端宕机,发送数据包没有受到ACK,超时后重传,其他数据包...

  • 八.网络协议学习笔记 传输层TCP-序号_确认号_建立连接

    TCP-序号-确认号 在发请求之前TCP3次握手 SYN=1建立连接 ACK=0 数据包大小为0,头部32字节,包...

  • 网络安全实验报告 第二章

    利用TCP协议实现synflood攻击 运行syn攻击程序,以靶机为目标主机对其发送syn数据包,查看目标主机状态...

  • tcp三次握手

    TCP状态 SYN——同步序列编号,在建立连接时发送。ACK——确认信息,在确认SYN信息时发送,响应信息。FIN...

  • 三次握手失败怎么办?

    tcp建立连接三次握手,主动方发送请求syn,server接收到信息,返回带有数据包的信息syn_sent,然后接...

  • 三次握手四次挥手

    三次握手 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST,...

  • 三次握手&&四次挥手

    ACK:TCP协议规定,只有ACK=1的时候是有效的,也规定连接建立后所有发送的报文的ACK必须为1。 SYN(S...

  • 网络

    TCP/IP 一、三次握手过程及状态变化 客户端发送SYN = 1 ACK = 0 seq = x,状态变为SYN...

  • TCP中的握手

    一、TCP层FLAGS标志字段 SYN: 表示建立连接FIN: 表示关闭连接ACK: 表示响应PSH: 表示有 ...

网友评论

    本文标题:详解TCP数据包中SYN,ACK字段与数据发送的关联

    本文链接:https://www.haomeiwen.com/subject/mqrbuctx.html