当前位置:网站首页>应用程序间的数据传输TCP协议的特点及
应用程序间的数据传输TCP协议的特点及
2022-07-29 15:28:00 【华为云】
TCP服务特点
面向连接、基于字节流和可靠传输。
TCP的面向连接是什么意思?
通信双方都必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。
同时,TCP连接是全双工的,就是说,双方数据的读写,可以通过一个连接进行,完成数据交换之后,通信双方都必须断开连接,以释放系统资源。而且,TCP连接是一对一的,所以,基于广播和多播的应用程序不能使用TCP服务,而无连接协议UDP,倒非常适合广播和多播。
字节流服务和通信报区别
主要体现在通信双方是否执行相同次数的读写操作。

如图所示,当发送端应用程序同时执行多次写操作时,TCP模块必须先将这些数据放入发送缓冲区中,当TCP模块真正发送数据时,发送缓冲区中这些数据才会被封装成一个或多个TCP报文段发出,简言之,TCP模块发出的报文段个数与发送端应用程序执行的写操作次数之间没有固定的数量关系。
同时,当接收端收到一个或多个TCP报文段后,TCP模块要将它们携带的应用数据根据的TCP报文段的序号依次放入接收缓冲区中,同时通知应用程序读取数据。接收端应用程序可以将接收缓冲区中的数据一次读出,也可以多次读出,这取决于用户指定的应用程序读缓冲区大小,简言之,接收端应用程序执行的读操作次数与TCP模块接收到的TCP报文段个数也没有固定的数量关系。
总而言之就是,发送端执行的写操作数量和接收端执行的读操作数量之间没有任何的数量关系。
通信双方数据传输是没有边界的,这也就是TCP的字节流的概念。
而UDP的数据报截然相反,发送端应用程序每执行一次写操作,接收端应用程序都必须执行一次对应的读操作。否则,就会发生丢包。并且,如果用户没有指定足够的应用数据缓冲区来读取数据报,那么UDP数据报就会发生截断。
TCP的可靠传输是由何支撑的:
发送应答机制
发送端发送的每个TCP报文段都必须得到接收端的应答,才认为这个TCP报文段传输成功。
超时重传机制
发送端在发出一个TCP报文段之后,就开始定时,如果在定时时间内没有收到应答,就会重新发送这个报文段。
同时,TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端时可能乱序、重复,TCP协议还会对接收到的TCP报文段重排、整理,再交付给应用程序。
而UDP数据报服务则不可靠,需要上层协议处理数据的确认和超时重传。
TCP头部结构
通过了解TCP头部结构,我们可以认识到传输层在TCP协议栈中的作用。
TCP头部信息用于指定通信源端端口,目标端端口,管理连接等这些任务。如下图所示:
32位序号
在一次TCP通信,从连接建立到释放连接的整个过程中,在某一个传输方向上的字节流的每个字节的编号就是由这个32位序号确认的。
在两个主机通信时,第一次发送的TCP报文段中,32位序号为系统给出的随机值,我们称它为初始序号(ISN),在该传输方向上,后续的TCP报文段中,序号,将被系统设置为ISN+该报文段所携带数据的第一个字节在整个字节流中位置的偏移。
另外一个传输方向上,亦然。
32位确认号
TCP报文段中,发送方不仅携带自己的数据序号,还携带对通信另一方所发送的数据的确认。
4位头部长度
标识该TCP头部有多少个4字节,最大值是15,所以TCP头部最大长度是60个字节。
6位标志字段
- URG:紧急指针是否有效。
- ACK:确认号是否有效(我们称携带ACK标志的TCP报文段为确认报文段)。
- PSH :push字段,提示接收端程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间,因为应用程序如果不把这些数据读走,这些数据会一直停留在TCP接收缓冲区中,这样会占用很大的内核资源。
- RST:要求对方重新建立连接(复位报文段)
- SYN:表示请求建立一个连接(同步报文段)
- FIN:通知对方关闭连接(结束报文段)
16位窗口大小
是TCP流量控制的手段。这里的窗口指接收通报窗口(Receiver window),提示本端TCP接收缓冲区还能容纳多少字节数据,这样对方就可以控制数据发送的速度。
16位校验和
由发送端填充,接收端对TCP报文段执行CRC算法,来检验数据是否损坏。该检验不仅包括头部,也包括数据部分。
- 16位紧急指针
表示最后一个紧急数据的下一字节序号。

40选项
kind类型 length总长度 info具体信息(常见TCP选项具体信息如下)

0:选项表结束选项
1:空操作选项。无特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。
2:最大报文段长度选项。连接初始化时,通信双方使用该选项来协商最大报文段长度。TCP模块通常将最大报文段长度设为MTU-40,这里的40指20字节的TCP头部和20字节的TCP头部,这样一来,携带TCP报文段的IP数据报的长度就不会超过MTU。
ps:MTU即最大传输单元,该参数通常与通信接口有关(网络接口卡、串口等)。
3:窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项协商接收通道窗口扩大因子的大小。因为在TCP协议中,接收通道窗口的大小是用16位表示的,也就是65535个字节,但实际上TCP模块允许的接收通道窗口远不止这个数目,比这个大是为了提高通信的吞吐量,窗口扩大因子就是为了解决这个问题。
如果窗口大小位N,而窗口扩大因子为M,那么窗口实际大小就是N*(2^M)。窗口扩大因子选项只能出现在同步报文段中,当连接建立成功之后,该值将固定不变。
4:选择性确认(SACK)选项。当TCP报文段发生丢失时,TCP模块就会重传最后被确认的TCP报文段之后的所有报文段,但这样的话,原先已经成功发送的报文段也可能重复发送,就降低了TCP模块的性能。选择定确认选项就是为了解决这个问题,它让TCP模块儿只重新发送丢失的TCP报文段。
5:SACK实际工作的选项。告诉发送端,本端已经收到的不连续的数据块,从而让发送端根据此选项重新发送丢失的数据块。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。
8:时间戳选项。提供比较准确的计算通信双方之间的回路时间的方法。
边栏推荐
- 文件管理:文件的逻辑结构
- Do you really understand the persistence mechanism of Redis?
- 大模型轻量化实践路径
- 突破性能天花板!亚信数据库支撑 10 多亿用户,峰值每秒百万交易
- CAN报文:数据帧详解
- 最新!多交的税可以退,同学,你今天退税了吗?
- 机器学习的3大“疑难杂症”,因果学习是突破口 | 重庆大学刘礼
- Floating point memory storage problem
- 稳稳当当的生活
- Altair SimSolid complex assembly meshless rapid structure simulation online seminars
猜你喜欢

qt vs2015中无法打开源文件“QtWidgets”的解决方案

【小程序项目开发--京东商城】uni-app之自定义搜索组件(上)-- 组件UI

MySQL数据库安装配置保姆级教程(以8.0.29为例)有手就行
如何破坏单例?我说了好几种方式,面试官:没想到你真会
![[yolov7 series two] positive and negative sample allocation strategy](/img/8d/5f04d33b957f3ce58243ea807c1fe2.png)
[yolov7 series two] positive and negative sample allocation strategy

HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

又一位AI大佬辞职进体制内!AI的尽头是编制?

数商云SCM供应链系统方案服务亮点:生产管理更智能、产业供应链协同管理更便捷

易基因:人类tRNA基因位点表现出与衰老相关的DNA高甲基化|研究文章

从通信延伸到全行业,亚信科技AntDB 7.0蓄势待发
随机推荐
mysql的union和union all
Detailed evaluation of Renesas RZ/G2L processor
一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?
Rust P2P网络应用实战-1 P2P网络核心概念及Ping程序
c#替换字符串中字符出现某次的字符
Altair SimSolid复杂装配体无网格快速结构仿真线上研讨会
图文结合纯c手写内存池
3分钟带你了解微信小程序开发
Unable to open the source file in qt vs2015 "QtWidgets" solution
韦伯首批照片引发论文竞速大战:晚13秒即错失首发,科研党纷纷肝得起飞
如何创建NFT(还在创作中ing)
Flink SQL Hudi 实战
Impala时间函数总结
NTP服务器搭建
[MySQL] 运算符
DevOps的未来趋势
使用DataEase开源工具制作一个高质量的数据大屏
腾讯云数据库负责人林晓斌借1亿炒股:已爆仓破产
解题-->在线OJ(十七)
MySQL数据库安装配置保姆级教程(以8.0.29为例)有手就行