TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知

本文详细介绍了TCP协议中的关键概念,如滑动窗口、状态位标志(如CWR、ACK、URG等)、TCP状态机以及三次握手和四次挥手的流程。作者通过Wireshark实例展示了数据传输过程中的细节,并强调了TCP协议在确保可靠性和顺序性方面的机制。
摘要由CSDN通过智能技术生成

5、窗口(Advertised-Window):著名的滑动窗口(Sliding Window),用于TCP的流量控制。

6、状态位(TCP-FLAG):包的类型,用于操作TCP的状态机,其8位状态分别表示如下含义

  • CWR(Congestion Window Reduce) 0x80:拥塞窗口减少标志set by sender,用来表明它接收到了设置ECE标志的TCP包。并且sender 在收到消息之后已经通过降低发送窗口的大小来降低发送速率。

  • ECE(ECN Echo) 0x40:ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的。在数据传输过程中也用来表明接收到的TCP包的IP头部的ECN被设置为11。

  • URG(Urgent) 0x20:该标志位表示紧急(The urgent pointer) 标志有效,设置为1时,首部中的紧急指针有效;为0时,紧急指针没有意义。紧急数据不进入接收缓冲区直接交给上层进程处理;

  • ACK 0x10:取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。后续文章介绍中当ACK标志位有效的时候我们称呼这个包为ACK包,使用大写的ACK称呼。

  • PSH(Push) 0x08:该标志置位时,一般是表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。如果PSH=1的话,就不用等到整个缓存都填满,直接把缓存区中的所有数据进行交付。

  • RST(Reset) 0x04:用于reset相应的TCP连接。通常在发生异常或者错误的时候会触发复位TCP连接。

  • SYN 0x02:同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。

  • FIN(Finish) 0x01:No more data from sender。当FIN标志有效的时候我们称呼这个包为FIN包。

7、校验位(Checksum):16位TCP头。发送端基于数据内容计算一个数值,接收端要与发送端数值结果完全一样,才能证明数据的有效性。接收端checksum校验失败的时候会直接丢掉这个数据包。CheckSum是根据伪头+TCP头+TCP数据三部分进行计算的。

8、紧急指针(Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。

9、选项(Option):长度不定,但长度必须以是32bits的整数倍。常见的选项包括MSS、SACK、Timestamp等等。

二、TCP状态机

============

关于TCP的状态机理解我们从几张经典的示意图开始

TCP状态转换图

TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知

TCP三次握手、四次挥手时序图

TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知

基于TCP的网络编程中链接的建立断开、数据发送都是依赖TCP状态转换实现的,例如所谓的建立链接并不是真正的链接,而是一种状态的维持,表面上的链接其实是通讯双方共同维护了一个“链接状态”,而建立链接–数据传输–断开链接的TCP通信过程,也是这些状态转换的过程,这其中状态的转换一部分是收到或发送的某个控制位字段的变化而引起的,如SYN、FIN、ACK等,还有一些是由于应用程序的动作或计时器超时引发的。

了解了以上的内容,下面我们就结合实际报文数据,对TCP链接三次握手,数据传输,断开四次挥手,进行一个简单的跟踪验证;

三、TCP通讯

===========

1、三次握手

建立链接的三次握手的作用主要是初始化Sequence Number 的初始值,同时把这个值通过Synchronize Sequence Numbers(SYN包)告知对端。

通过Wireshark可以捕获到三次握手的报文

TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知

握手流程:

  • 1、client首先初始化该值,发送一个SYN包给server端,告诉server端一个初始化的SN值

  • 2、server收到client发送的数据,回复一包数据,包括ACK确认与SYN, 既要告诉client端收到了数据,同时告知对方SYN值;

  • 3、client回复ACK确认包,告知server端收到了数据;

2、数据传输

通过Wireshark,我们可以看下TCP传输中一包数据的组成,对照前面的协议组成,可以看到这里我们发送的是0x11,0x11两个字节的数据

TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知

可以看到接收一段回复的确认包里ACK从1变成了3,为保证数据的顺序性与可靠性,TCP是有一整套的机制来控制的,如大家熟悉的滑动窗口、超时重传等;

TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知

这里有一个需要注意的细节,这里ACK确认号的真实值其实是从0xffeb49ed 变为 0xffed49ef的,这是由于当某个主机开启一个TCP会话时,他的初始序列号与确认号是随机的,可能是0和4,294,967,295之间的任意值,在Wireshark里显示的都是相对序列号/确认号,而不是实际序列号/确认号,相对序列号/确认号是和TCP会话的初始序列号相关联的。这里Wireshark为方便大家跟踪查看显示的是相对值,因为比起真实序列号/确认号,跟踪更小的相对序列号/确认号会相对容易一些。

3、四次挥手

断开链接的四次挥手的作用主要是回收资源,停止数据传输。由于TCP是全双工的,需要client与server两端分别断开各自的通向对方的通道。

通过Wireshark可以捕获到四次挥手的报文

TCP协议漫谈,深入浅出实战网络编程开发,带给你不一样的认知
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后如何让自己一步步成为技术专家

说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。

当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。

推荐一份Java架构之路必备的学习笔记,内容相当全面!!!

成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。

你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!

进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

【关注】+【转发】+【点赞】支持我!创作不易!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

【关注】+【转发】+【点赞】支持我!创作不易!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值