当前位置: 首页 > news >正文

深入理解网络传输协议——TCP/IP协议的可靠交付服务的特征

应用程序与TCP/P可靠交付服务之间的接口可以用五个特征来描述:

  • 面向数据流。

当两个应用程序(用户进程)传输大量数据时,我们把这些数据当做一个可划分为八位组(octet)的比特流(通常我们也将八位组非正式地称为字节)。在目的机器上运行的数据流交付服务软件传给接收方的八位组与源机器上的发送方送出来的完全一样。

  • 虚电路连接。

数据流的传输与打电话类似。在传输开始之前,接收应用程序和发送应用程序都要与操作系统进行交互,通知它们需要进行数据流传输。

从概念上讲,数据流传输过程就像一个应用程序打了一个对方必须接的电话。在双方的操作系统中,协议软件模块通过在互联网上传输报文来进行通信,查证这个传输是否被授权,双方是否做好了准备。所有的细节设定之后,协议模块通知应用程序已经建立了连接,可以开始进行传输。在传输过程中,通信双方的协议模块继续进行通信,以确保数据正确到达。

如果出于某种原因通信失败了(例如两台机器之间的路径上的某网络硬件失效),这两台机器都检测到故障并将其报告给适当的应用程序。我们使用术语“虚电路”(virtual circuit)来描述这种连接是因为虽然在应用程序看来这种连接像是一条专用的硬件线路,但这种可靠连接的错觉是由数据流交付服务提供的。

  • 有缓冲的传输。

应用程序不断地向协议软件传递数据八位组,通过虚电路发送数据流。在传输数据的时候,每个应用程序使用自己认为适宜的任何大小的数据片,最小可为1八位组。

在接收端,协议软件所收到的由数据流交付服务送来的八位组与其发送顺序完全相同,因此经过校验后就可由接收应用程序使用。协议软件可以将数据流划分为若干分组,而不必考虑传输时的数据片大小。

为了提高传输效率以及减少网络通信量,协议软件在实现时都会从数据流中收集到足够多的数据,把它们组成大小合理的数据报后再送到互联网上传输。

因此,即便应用程序以一次1八位组的方式生成数据流,在互联网上的传输也会相当高效,与此类似,当应用程序要传输特别大块的数据时,协议软件也能把它们划分成适于传输的小数据块。对那些需要交付的数据不够填满一个缓冲区的应用程序,流服务提供了一种“推(push)”机制,应用程序使用该机制进行强迫传输。

在发送端,推操作强迫协议软件传输当前生成的所有数据,而不必等到缓冲区满。当这样的数据到达接收端时,推操作使得TCP立即将数据提交给应用程序。不过读者也许注意到了,推功能仅仅保证所有的数据都会被发送出去,但是并不规定传输的记录界限。所以即使数据是被强迫交付的,协议软件还是可以选择将这个流进行划分。

  • 无结构的数据流。

TCP/IP流服务并不按照结构化的数据流形式。例如,在工资表应用程序中,数据流服务无法区分雇员记录的界限,也不能识别数据流的内容是工资数据。使用数据流服务的应用程序必须在开始连接之前就了解数据流的内容并对其格式进行协商。

  • 全双工连接。

TCP/P流服务所提供的连接功能是双向的。这种连接称为全双工(fullduplex)连接。对一个应用程序进程而言,全双工连接包括了两个独立的、流向相反的数据流,而且这两个数据流之间不进行明显的交互。流服务允许一个应用程序进程停止一个方向上的数据流,而继续另一方向上的数据流,这样的连接称为半双工(half duplex)连接。全双工连接的优点在于底层协议软件能够把一个流的控制信息放在相反方向的数据报中发回到源主机。这种捎带(piggybacking)方式降低了网络通信量。

相关文章:

  • 面向对象进阶--继承(Java继承(超详解))
  • 关于QTcreator,19年大学时写的文章了,之前写在印象笔记现在拉过来,往事如烟呐
  • C#面:详细阐述什么是 DTO
  • 什么是数字化,什么是数智化?数字化与数智化的区别和联系
  • BT音频方案
  • 央国企财务专家的“专家课”——中国总会计师协会联合实在智能举办RPA专项培训
  • web标准与浏览器前缀
  • GANs网络在图像和视频技术中的应用前景
  • springboot中maven的使用教程
  • Qt 实战(4)信号与槽 | 4.1、信号与槽机制
  • 切换到root用户的方法和区别
  • Linux 编写脚本自动清理旧的日志文件,释放磁盘空间
  • 图论之岛屿系列
  • QGraphicsItem 自定义是否被选中
  • 人体接近传感器,ATM微波传感器,人体存在传感器 微波探测器YTMW8631
  • cookie和session
  • CSS魔法堂:Absolute Positioning就这个样
  • JS变量作用域
  • Laravel 中的一个后期静态绑定
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python3爬取英雄联盟英雄皮肤大图
  • SQLServer之创建显式事务
  • webgl (原生)基础入门指南【一】
  • 记一次和乔布斯合作最难忘的经历
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 力扣(LeetCode)21
  • 前端面试题总结
  • 如何用vue打造一个移动端音乐播放器
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 小程序开发中的那些坑
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​低代码平台的核心价值与优势
  • #微信小程序:微信小程序常见的配置传值
  • $NOIp2018$劝退记
  • (13)Hive调优——动态分区导致的小文件问题
  • (16)Reactor的测试——响应式Spring的道法术器
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (论文阅读40-45)图像描述1
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)mysql_MYSQL(三)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)、python程序--模拟电脑鼠走迷宫
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core Redis 使用有序集合实现延迟队列
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Project Open Day(2011.11.13)
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • @Bean, @Component, @Configuration简析
  • @property python知乎_Python3基础之:property
  • [acwing周赛复盘] 第 94 场周赛20230311