计算机网络之运输层

news2024/11/13 11:53:58

协议

协议就是计算机与计算机之间通信的“约定”,既为规则,只有遵循这个约定,双方就可以进行通信。

进程之间的通信

从通信和信息处理的角度来看,运输层向上面的应用层提供通信的服务,属于面向通信的最高层,同时也是用户功能的最底层。端到端的通信就是两个应用进程之间的通信

用户数据报协议UDP

特点

面向无连接通信

尽最大努力交付,是不可靠的传输

面向报文

没有拥塞控制

支持一对一,一对多,多对一,多对多的通信

首部开销小

首部格式

       (1)源端口:源端口号。在需要对方回信时选用。不需要时可用全0。

       (2)目的端口:目的端口号。在终点交付报文时使用。

       (3)长度:UDP用户数据报的长度,其最小值是8(仅有首部)。

       (4)检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。

 当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口上交最后的终点——应用进程。

如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。虽然在UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,因此不需要使用套接字(TCP之间的通信必须要在两个套接字之间建立连接)。UDP用户数据报首部中检验和的计算方法很特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是UDP用户数据报的真正的首部。只是在计算检验和时临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。

        (检验和的计算方法有些复杂,在此不做计算)

TCP传输控制协议

特点

面向连接的传输协议

每一条TCP连接都是点对点的,端点为套接字(socket)

可靠交付,就是相较于udp来说是安全的

提供全双工通信(全双工通信就是双方既是发送方也是接收方)

面向字节流

TCP连接点对点

每一条tcp连接都有两个端点,这个端点不是udp中的应用进程,而是叫做套接字(socket)根据定义,端口号连接到IP地址后面即构成了套接字,因此,套接字的表示方法是在点分十进制的ip地址后面加一个端口号,并且用冒号隔开

同一个IP地址可以有多个不同的TCP连接,而同一个端口也可以出现在多个不同的TCP连接中

同一个名词socket表达的意思也是不一样的,允许程序访问连网的协议叫做应用编程接口API

 tcp报文段首部格式

(1)源端口和目的端口

 各占 2 个字节,分别写入源端口号和目的端口号。 TCP 的分用功能是通过端口实现的。

(2)序号

 占 4 字节。序号范围是[0, 232−1 ],共 232 (即 4 294 967 296)个序号。序号增加到 232−1 后,下一个序号就又回到 0。也就是说,序号使用 mod 232 运算。 TCP 是面向字节流的。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是 301,而携带的数据共有 100字节。这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从 401 开始,即下一个报文段的序号字段值应为 401。这个字段的名称也叫做“报文段序号”。

(3)确认号 

占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如, B 正确收到了 A 发送过来的一个报文段,其序号字段值是 501,而数据长度是 200 字节(序号 501 ~ 700),这表明 B 正确收到了 A 发送的到序号 700 为止的数据。因此, B 期望收到 A 的下一个数据序号是 701,于是 B 在发送给 A 的确认报文段中把确认号置为 701。现在的确认号不是 501,也不是 700,而是 701。

总之,应当记住:若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。

由于序号字段有 32 位长,可对 4 GB(即 4 千兆字节)的数据进行编号。在一般情况下可保证当序号重复使用时,旧序号的数据早已通过网络到达终点了。

(4)数据偏移

 占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出 TCP 报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但应注意,“数据偏移”的单位是 32 位字(即以 4 字节长的字为计算单位)。由于 4 位二进制数能够表示的最大十进制数字是 15,因此数据偏移的最大值是 60 字节,这也是 TCP 首部的最大长度(即选项长度不能超过 40 字节)。

(5)保留

 占 6 位,保留为今后使用,但目前应置为 0。

下面有 6 个控制位,用来说明本报文段的性质,它们的意义见下面的(6)~(11)。

(6)紧急 URG (URGent) 

当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令( Control + C)。如果不使用紧急数据,那么这两个字符将存储在接收 TCP 的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了许多时间。

当 URG 置 1 时,发送应用进程就告诉发送方的 TCP 有紧急数据要传送。于是发送方TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。

(7)确认 ACK (ACKnowledgment) 

仅当 ACK = 1 时确认号字段才有效。当 ACK = 0时,确认号无效。 TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

(8)推送 PSH (PuSH)

 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下, TCP 就可以使用推送(push)操作。这时,发送方 TCP 把 PSH 置 1,并立即创建一个报文段发送出去。接收方TCP 收到 PSH = 1 的报文段,就尽快地(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

虽然应用程序可以选择推送操作,但推送操作很少使用。

(9)复位 RST (ReSeT) 

当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。 RST 也可称为重建位或重置位。

(10)同步 SYN (SYNchronization)

 在连接建立时用来同步序号。当 SYN = 1 而 ACK= 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN = 1 和 ACK = 1。因此, SYN 置为 1 就表示这是一个连接请求或连接接受报文。

(11)终止 FIN 

(FINis,意思是“完”、“终” ) 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

(12)窗口 

占 2 字节。窗口值是[0, 216 – 1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之, 窗口值作为接收方让发送方设置其发送窗口的依据。

例如,发送了一个报文段,其确认号是 701,窗口字段是 1000。这就是告诉对方:“从701 号算起,我(即发送此报文段的一方)的接收缓存空间还可接收 1000 个字节数据(字节序号是 701 ~ 1700),你在给我发送数据时,必须考虑到这一点。”

总之,应当记住:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。

(13)检验和 

占 2 字节。检验和字段检验的范围包括首部和数据这两部分。和 UDP用户数据报一样,在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。伪首部的格式与图中 UDP 用户数据报的伪首部一样。但应把伪首部第 4 个字段中的 17 改为 6(TCP 的协议号是 6),把第 5 字段中的 UDP 长度改为 TCP 长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用 IPv6,则相应的伪首部也要改变。

(14)紧急指针

 占 2 字节。紧急指针仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。 当所有紧急数据都处理完时, TCP 就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。

TCP 最初只规定了一种选项,即最大报文段长度 MSS (Maximum Segment Size) 。注意 MSS 这个名词的含义。 MSS 是每一个 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。所以 MSS 并不是整个 TCP 报文段的最大长度,而是“TCP 报文段长度减去 TCP 首部长度”。

为什么要规定一个最大报文段长度 MSS 呢?这并不是考虑接收方的接收缓存可能放不下 TCP 报文段中的数据。实际上, MSS 与接收窗口值没有关系。我们知道, TCP 报文段的数据部分,至少要加上 40 字节的首部(TCP 首部 20 字节和 IP 首部 20 字节,这里都还没有考虑首部中的选项部分),才能组装成一个 IP 数据报。若选择较小的 MSS 长度,网络的利用率就降低。设想在极端的情况下,当 TCP 报文段只含有 1 字节的数据时,在 IP 层传输的数据报的开销至少有 40 字节(包括 TCP 报文段的首部和 IP 数据报的首部)。这样,对网络的利用率就不会超过 1/41。到了数据链路层还要加上一些开销。但反过来,若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的 TCP 报文段。当传输出错时还要进行重传。这些也都会使开销增大。

因此, MSS 应尽可能大些,只要在 IP 层传输时不需要再分片就行。由于 IP 数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要分片的 MSS,如果改走另一条路径就可能需要进行分片。因此最佳的 MSS 是很难确定的。在连接建立的过程中,双方都把自己能够支持的 MSS 写入这一字段,以后就按照这个数值传送数据,两个传送方向可以有不同的 MSS 值 。若主机未填写这一项,则 MSS 的默认值是 536 字节长。因此,所有在互联网上的主机都应能接受的报文段长度是 536 + 20(固定首部长度) = 556 字节。

随着互联网的发展,又陆续增加了几个选项。如窗口扩大选项、 时间戳选项等。以后又增加了有关选择确认(SACK)选项。

窗口扩大选项是为了扩大窗口。我们知道, TCP 首部中窗口字段长度是 16 位,因此最大的窗口大小为 64 K 字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络 ,传播时延和带宽都很大,要获得高吞吐率需要更大的窗口大小。

窗口扩大选项占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于 TCP 首部中的窗口位数从 16 增大到(16 + S)。移位值允许使用的最大值是 14,相当于窗口最大值增大到 216+14−1 。

窗口扩大选项可以在双方初始建立 TCP 连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送 S = 0 的选项,使窗口大小回到 16。

时间戳选项占 10 字节, 其中最主要的字段是时间戳值字段(4 字节) 和时间戳回送回答字段(4 字节)。时间戳选项有以下两个功能:

第一,用来计算往返时间 RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出 RTT 来。

第二,用于处理 TCP 序号超过 232 的情况,这又称为防止序号绕回 PAWS (ProtectAgainst Wrapped Sequence numbers)。我们知道, TCP 报文段的序号只有 32 位,而每增加 232 个序号就会重复使用原来用过的序号。当使用高速网络时,在一次 TCP 连接的数据传送中序号很可能会被重复使用。例如,当使用 1.5 Mbit/s 的速率发送报文段时,序号重复要 6小时以上。但若用 2.5 Gbit/s 的速率发送报文段,则不到 14 秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以在报文段中加上这种时间戳。

拥塞控制

网络中某一资源的需求量超过了资源所能提供的可用部分,网络性能就要变坏叫做拥塞

TCP进行拥塞控制的四种算法

慢开始

拥塞避免

快重传

快恢复

三次握手

四次挥手

为什么建立连接需要三步,而释放连接需要四步?

因为发送请求时同时发送SYN和ACK报文,而释放连接需要收到FIN报文后不会进行立即关闭,而是先告诉对方收到了他的FIN报文,只有报文全部发送完毕后才可以发FIN报文,因此不可以同时发,所以需要四步

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis哨兵(非集群 Rrdis 的高可用性 )

Redis哨兵(非集群 Rrdis 的高可用性 ) 1. 什么是哨兵 吹哨人巡查监控后台 master 主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务 Redis哨兵在不使用Redis集群时为Redis提供高可用性 2. 作用 无人值守运维 3. 哨兵作为分布式系统 Redis S…

console.log(obj)不一定能的到obj当前的值

1.Log (anObject)的输出具有误导性; 只有在控制台中展开 > 时才能解析显示的对象的状态。它不是您在 console.log 对象时对象的状态。 相反,尝试 console.log (Object.keys ()) ,或者甚至console.log(JSON.parse(JSON.stringify(obj))) ,…

黑盒(功能)测试基本方法

1、黑盒测试的概念 1、什么是黑盒测试 (1)黑盒测试又称功能测试、数据驱动测试或基于规格说明书的测试,是一种从用户观点出发的测试。 (2)测试人员把被测程序当作一个黑盒子。 2、黑盒测试主要测试的错误类型有 &…

JVisualVM、Visual GC

JVisualVM JVisualVM Java VisualVM 是一款 JDK 自带免费的性能分析工具 public class JVisualVM {public static void main(String[] args) {Thread t1 new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {}}, "JVisualVM测试子线程");t1.…

flinkcdc 动态的增加新的同步表到同一个作业中

背景 flinkcdc 2.0版本上线了一个新功能–支持动态加表这个是很有用的feature,本文介绍在开发中如何使用。 设想下假如你一个 CDC pipeline 监控了 4 张表,突然有天业务需求需要再加几张表,你肯定不想另起作业 (浪费资源),那么这…

大数据——HDFS(分布式文件系统)

一,分布式系统概述 Hadoop的两大核心组件 HDFS(Hadoop Distributed Filesystem):是一个易于扩展的分布式文件系统,运行在成百上千台低成本的机器上。HDFS具有高度容错能力,旨在部署在低成本机器上。HDFS主…

日撸 Java 三百行day34

文章目录 说明Day34 图的深度优先遍历1.思路2.代码3.总结1.在广度遍历中借助了队列2.在深度优先遍历借助了栈。 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a…

Android 开发之核心技术点——性能优化篇(带面试题)~

性能优化对于Android开发的重要性非常大。随着Android设备的不断升级,用户对应用的要求也越来越高,包括应用的运行速度、响应速度、流畅度等方面。如果应用的性能不能满足用户的需求,很可能会导致用户流失、差评以及应用被卸载等情况。 另外…

boot-admin整合flowable官方editor-app进行BPMN2.0建模

boot-admin整合flowable官方editor-app源码进行BPMN2.0建模 正所谓百家争鸣、见仁见智、众说纷纭、各有千秋!在工作流bpmn2.0可视化建模工具实现的细分领域,网上扑面而来的是 bpmn.js 这个渲染工具包和web建模器,而笔者却认为使用flowable官…

2023零基础快速跟上人工智能第一梯队

写在前面:有关人工智能学什么,怎么学,什么路线等一系列问题。我决定整理一套可行的规划路线,希望帮助准备入门的朋友们少走些弯路。 下面我会推荐一个比较快速可行的学习模板,并附上我认为比较好的学习资料。 新手不建…

git使用规范文档

git使用规范文档 Git使用规范流程图 开发人员操作步骤: 第一步:clone代码 在你的本地代码库进行从远程仓库clone代码操作(100%表示clone完成) 进入项目文件,右键Git Bash Here 切换到你所进行开发的分支上 拉取该分…

JavaSE学习进阶day05_02 常见的数据结构和List接口

第三章 数据结构(掌握) 3.1 数据结构介绍 数据结构 : 数据用什么样的方式组合在一起。 科班出身的同学我想你对数据结构一点也不陌生,不知道你记不记得,当时学习数据结构的逻辑结构中的集合时,只是简单了解它&#…

hackathon 复盘:niche 海外软件工具正确的方法 6 个步骤

上周末,去参加了北京思否 hackathon,两天时间内从脑暴 & 挖掘软件 IDEA -> Demo 研发路演,这次经历让我难忘。这里我的看法是每个开发者圈友,都应该去参加一次 hackathon ~ 做 niche 软件正确的方法 这边先说结论&#xf…

vmware下Ubuntu系统中安装vscode

文章目录 前言:在线下载:离线下载包:配置C/C环境 前言: 这篇博客是为后面交叉编译程序放到树莓派上运行做的准备。同时也是自己在装过程中的一个记录。 在线与离线安装的唯一不同就是获取安装包是在线下载还是别的地方拷贝过来以…

【数据结构】- 链表之单链表(中)

文章目录 前言一、单链表(中)1.1 头删1.2尾删1.2.1第一种方法:1.2.2第二种方法:1.2.3多因素考虑 二、完整版代码2.1 SList.h2.2 SList.c2.3 Test.c 总结 前言 千万不要放弃 最好的东西 总是压轴出场 本章是关于数据结构中的链表之单链表(中) 提示&#…

数据结构与算法基础(王卓)(26)线性表的查找(2):顺序查找(二分查找、分块查找)

二、折半查找(二分或对分查找) 前置条件和前面一样 最开始根据PPT示(实)例写出的程序框架: 一开始: low:第一位 high:最后一位 mid:正中间 查找数小于mid: 把high移动到mid前面一位(…

从0搭建Vue3组件库(四): 如何开发一个组件

本篇文章将介绍如何在组件库中开发一个组件,其中包括 如何本地实时调试组件如何让组件库支持全局引入如何在 setup 语法糖下给组件命名如何开发一个组件 目录结构 在packages目录下新建components和utils两个包,其中components就是我们组件存放的位置,而utils包则是存放一些…

观看js编程范式笔记(函数式编程)

js为什么鼓励函数式编程? JavaScript(简称 JS)是一种面向对象和函数式编程语言,但它在语言层面上更加鼓励函数式编程。以下是几个原因: 函数是一等公民:在 JavaScript 中,函数被视为一等公民&a…

HANA SDA连接外部数据库到BW的步骤

咱都知道,我们不能直接从BW连接到外部数据库。第一步得从HANA database通过SDA去建一个到外部DB的连接。 数据库连接好了,那么接下来别忘了,还得建一个源系统。 也就是说第一步,我们要用HANA SDA通过Linux ODBC driver去连接外部…

Vue3表格(Table)

Vue2表格&#xff08;Table&#xff09; 可自定义设置以下属性&#xff1a; 表格列的配置项&#xff08;columns&#xff09;&#xff0c;类型&#xff1a;Array<{title?: string, width?: number, dataIndex?: string, slot?: string}>&#xff0c;默认 [] 表格数…