【计算机网络】——传输层

news2025/1/10 19:16:23

//图片取自王道,仅做交流学习

一、传输层提供的服务

物理层、数据链路层、网络层是通信子网。

传输层:它属于面向通信部分的最高层,同时也是用户功能的最低层

为应用层提供通信服务使用网络层的服务

网络层提供主机之间的逻辑通信。

1、传输层的功能:


1.传输层提供进程和进程之间的逻辑通信(即端到端通信)。网络层提供的主机到主机之间的通信

2.复用和分用

复用:发送方不同的应用进程都可以使用同一个传输层协议传输数据;

分用:接收方的传输层在剥去报文的首部之后能正确的把这些数据交付到目的进程。


3.传输层对收到的报文进行差错检测


4.传输层的两种协议

面向连接的TCP 无连接的UDP

面向连接的传输控制协议TCP

尽管下面的网络是不可靠的(只提供最大努力的服务),但是这种逻辑信道就相当于一条全双工的可靠信道。

传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等。可靠,面向连接,时延大,适用于大文件。



无连接的用户数据报协议UDP
传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
不可靠,无连接,时延小,适用于小文件。

逻辑信道不可靠

2、传输层的寻址与端口

端口

能让应用层各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文中的数据向上通过端口交付给应用层的进程。

它 是传输层的SAP,它在传输层的作用类似于IP地址在网络层,MAC地址在数据链路层的作用。只不过IP地址和MAC地址标识主机,而端口标识的是主机中的应用进程。

端口是传输层的SAP(服务访问点 Service Access Point)

端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的。

端口号长度为16bit  (2个字节),能表示65536个不同的端口号。

登记端口,比如Tomcat 8080, Mysql:3306,  redis 6379,RabbitMQ 5672

在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。

套接字socket= (主机IP地址,端口号)

3、无连接服务与面向连接服务

面向连接的服务就是在通信双方进行通信之前,必须先建立连接,整个连接的情况一直被实时监控和管理。通信结束之后,应该释放这个链接。

无服务链接是指两个实体之间的通信不需要先建立好连接,需要通信的时,直接将信号发送到"网络”中,让该信息的传递在网上尽力而为的往目的地传送。

TCP是面向连接的,向上提供了一条逻辑上全双工的可靠的信道,适合可靠性要求较高的场景,如FTP,HTTP,TELNET。TCP 提供确认、流量控制、计时器及连接管理等,开销较大

UDP是无连接的非可靠传输协议,简单,速度快,实时性好。适合小文件传输 TFTP,DNS,SNMP和实时传输协议RTP都是基于DNS。

二、UDP

1、UDP数据报

UDP只在IP数据报服务之上增加了很少功能:复用分用 差错检测功能

UDP的主要特点:

1.UDP是无连接的,减少开销和发送数据之前的时延。

2.UDP使用最大努力交付,即不保证可靠交付。

3.UDP是面向报文的,适合一次性传输少量数据的网络应用。

4、UDP无拥塞控制,适合很多实时应用。

5.UDP首部开销小,8B,TCP 20B。

6、UDP支持一对一,一对多,多对一,多对多的交互通信。

应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文。

UDP报文格式

UDP报文=UDP首部 + 用户数据。

UDP首部4个字段,共8个字节,每个字节的长度都是2B。

1)源端口。源端口号。在需要对方回信时选用,不需要时可用全 0。
2) 目的端口。目的端口号。这在终点交付报文时必须使用到。

3)长度。UDP 数据报的长度(包括首部和数据),其最小值是 8(仅有首部)。

4)校验和。检测 UDP 数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机
不想计算校验和时,则直接令该字段为全 0。

伪首部只有在计算检验和时才出现,不向下传送也不向上递交
17:封装UDP报文的IP数据报首部协议字段是17。
UDP长度:UDP首部8B   +   数据部分长度(不包括伪首部)。

当传输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口上交给应用进程,如图。

如果接收方 UDP 发现收到的报文中的目的端口号不正确 (即不存在对应于端口号的应用进程),那么就丢弃该报文,并由 ICMP 发送“端口不可达”差错报文给发送方。

2、UDP校验

//待详细补充

二、TCP

UDP的报文长度由发送应用进程决定,而TCP的报文长度由接收方给出的窗口值和当前网络拥塞成都决定的。

1、协议特点

1.TCP是面向连接(虚连接) 的传输层协议。打call

2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。

3.TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重

4.TCP提供全双工通信。

发送缓存 准备发送的数据&已发送但尚未收到确认的数据

接收缓存 按序到达但尚未被接受应用程序读取的数据&不按序到达的数据

5.TCP面向字节流  (流:流入到进程或从进程流出的字节序列。)

TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流

2、TCP报文段

TCP的数据单元称为 报文段,TCP报文段既可以运载数据,也可以建立连接、释放连接、应答。(根据控制字内容来决定)

TCP报文 = 首部  + 数据部分

整个TCP报文段作为IP数据报的数据部分封装在IP数据报中。

其首部前20B是固定的,TCP首部 最短为20B,后面有4N个字节是根据需要增加的选项,长度为4B的整数倍。

即:

TCP头 =固定20B + N*4B选项。

UDP头 =8B

TCP首部格式

1)源端口和目的端口,各站2B。端口是传输层与应用层的服务接口,传输层的复用和分用都需要通过端口来实现。

2)序号: 占4B,范围  0 ~(2^32 )-1  在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据第一个字节的序号。(TCP是面向字节流的)

3) 确认号: 4B  期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。

4) 数据偏移(首部长度): TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。 由于数据偏移 占4bit,而4个bit位所能表示的最大数字是15,所以首部长度最大为 15*4B =60B

5)保留  6位。

6)6个控制位


紧急位URG: URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。


确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1


推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。


复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。


同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文。


终止位FIN: FIN=1时,表明此报文段发送方数据已发完,要求释放连接。

7)窗口:占2B 范围0~2^16 -1,它指出现在允许对方发送的数据量,接收方数据缓存空间是有限的,因此窗口值作为接收方让发送方设置其发送窗口的一句。(大哥你慢点)

8)校验和。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时和UDP一样,要在TCP报文段前面加上12B的伪首部(只需要将UDP伪首部协议字段的17 改为 6,UDP长度字段改为TCP长度字段,其他和UDP一样)

9) 选项: 长度可变 TCP最初只规定一种选项, 即最大报文段长度(MSS)。MSS 是TCP报文段中的数据字段的最大长度(注意是数据字段)。

10)填充:   为了使得整个首部长度是4B的倍数

3、TCP连接管理

TCP连接的三个过程:

建立连接 ----- 数据传送 ----连接释放

TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。

TCP的链接:三次握手

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:

ROUND 1:
客户端发送连接请求报文段,无应用层数据,客户端进入 SYN-SENT状态(同步已发送)

SYN=1,seq=x(随机)


ROUND 2:
服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。

TCP服务器进入SYN-RECVD 状态(同步收到)


SYN=1,ACK=1,seg=y(随机),ack=x+1

ROUND 3:
客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。

TCP客户端进程进入  ESTABLISHED状态(已建立)
SYN=0,ACK=1,seg=x+1,ack=y+1

SYN洪泛攻击发生在OI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。

        SYN cookie

TCP的链接释放:四次挥手

参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。

ROUND 1:
客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。

FIN=1,seq=u


ROUND 2:

服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了一一半关闭状态。

服务器进入CLOSS-WAIT 等待关闭状态

ACK=1,seq=v,ack=u+1


ROUND 3:
服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。(服务器进入LAST-ACK 最后确认状态)
FIN=1,ACK=1,seg=w,ack=u+1


ROUND 4:
客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命) 后,连接彻底关闭。

ACK=1,seq=u+1,ack=w+1

总结:
1)建立连接 3步

1、SYN =1 seq=x

2、SYN=1,ACK=1 , seq =y,  ack =x+1

3、ACK=1, seq=x+1,ack=y+1

3) 释放连接

1、FIN=1,seq=u

2、ACK=1,seq=v,ack=u+1

3、FIN=1, ACK=1,seq =w,ack =u+1

4、ACK=1,seq=u+1 ack =w+1

4、TCP可靠传输


网络层提供尽最大努力交付,不可靠传输,想要保证可靠传输,还是得依靠传输层

使用TCP实现可靠传输

所谓可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。

TCP实现可靠传输机制的手段
1、校验 ,

和UDP一样,增加了伪首部

2、序号

TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流上,而不是报文段。

TCP 连接传送的数据流中的每个字节都编上一个序号。序号字段的值是指本报文段所发送的数据的第一个字节的序号。如图 5.9 所示,假设A 和图5.9 A的发送缓存区中的数据划分成TCP段之间建立了一条 TCP 连接,A 的发送缓存区中共有 10B,序号从0开始标号,第一个报文包含第 0~2 个字节,则该 TCP 报文段的号是0,第二个报文段的序号是 3。

3、确认

TCP 首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。在图5.9 中如果接收方 B 已收到第一个报文段,此时 B 希望收到的下一个报文段的数据是从第3 个字节开始的,那么B 发送给A 的报文中的确认号字段应为 3。

发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。TCP 默认使用累积确认,即 TCP 只确认数据流中至第一个丢失字节为止的字节。例如,图5.9 中,接收方B收到了A发送的包含字节0~2及字节6~7的报文段。由于某种原因,B还未收到字节3~5的报文段,此时 B 仍在等待字节 3(和其后面的字节),因此B到A的下一个文段将确认号字段置为3。

4、重传

有两种事件会导致 TCP 对报文段进行重传:超时和冗余 ACK

1)超时
TCP 每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但未收到确认时,就要重传这一报文段。

由于 TCP 的下层是一个互联网环境, IP数据报所选择的路由变化很大,因而传输层的往时延的方差也很大。为了计算超时计时器的重传时间,TCP 采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间(Round-TriTime,RTT)TCP 保留了 RTT 的一个加权平均往返时间 RTT,它会随新测量 RTT 样本值的化而变化。显然,超时计时器设置的超时重传时间(Retransmission Time-Out,RTO)应略大RTTs,但也不能大太多,否则当报文段丢失时,TCP 不能很快重传,导致数据传输时延大。

2)冗余ACK (冗余确认)


每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。发送方已发送1,2,3,4,5报文段
接收方收到1,返回给1的确认 (确认号为2的第一个字节)

接收方收到3,仍返回给1的确认(确认号为2的第一个字节)

接收方收到4,仍返给1的确认 (确认号为2的第一个字节)

接收方收到5,仍返回给1的确认 (确认号为2的第一个字节)

发送方收到3个对于报文段1的冗余ACK 认为2报文段丢失,重传2号报文段 快速重传

5、TCP流量控制

TCP 提供流量控制服务来消除发送方(发送速率太快)使接收方缓区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。.TCP 提供一种基于滑动窗口协议的流量控制机制。

接收窗口 rwnd 与拥塞窗口 cwnd

在通信过程中,接收方根据自已接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口 rwnd,即调整 TCP 报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。

即:

发送窗口 =min[ rwnd, cwnd] (单位字节)

【例】:

后续补充

传输层和数据链路层的流量控制的区别是:

传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制。

另外,数据链路层的滑动窗口协议的窗口大小不能动时动态变化,传输层的则可以动态变化。

6、TCP拥塞控制

//这个后面补充详解

概念:

与流量控制的区别:

方案:

1、慢开始和拥塞避免

2、快重传和快恢复

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

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

相关文章

go sync.Map包装过的对象nil值的判断

被sync.Map包装过的nil 对象,是不能直接用if xxx nil的方式来判断的 func testnil() *interface{} {return nil }func main() {var ptr *interface{}test : testnil()//p &Person{}fmt.Printf("ptr 的值为 : %v\n", ptr)fmt.Printf("ptr 的值…

控价与数据分析的关系

品牌在做线上控价时,会面对许多的数据,如店铺数据、行业数据,当这些数据仅仅只是拿来做监测低价输出低价报表使用,是没有发挥其最大作用的,因为商品链接的字段较丰富,涉及的内容会包含销量、评价量、促销信…

pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)

利用Anaconda创建pytorch虚拟环境 前提:成功安装Anaconda,确保可以打开NVIDIA控制面板 开始-》搜索“Anaconda Prompt” 打开后输入:conda create -n 你的虚拟环境名 python3.9。输入y,继续安装,完成。 输入&#…

容器适配器

除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue适配器。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。适配器本质上是一种机制,能使某种事物的行为看起来像另外一种事物一样。 所有容器…

C++笔记之尾置返回类型(trailing return type)

C笔记之尾置返回类型(trailing return type) 文章目录 C笔记之尾置返回类型(trailing return type)1.尾置返回类型的一些示例用法2.尾置返回类型对泛型编程的好处3.尾置返回类型通常在以下情况下派上用场4.既然auto可以自动类型推断,那为什么还需要尾置返回类型&…

微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning的在线课程 微调大型语言模型(一)的第一课:为什么要微调(Why finetune)。 我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月,那么如果我们向ChatGPT询问2022年以后发生的事情,它可能会产生…

K8S-Pod 进阶

Pod 进阶 一、资源限制(业务cpu 内存)1.定义2.Pod 和 容器 的资源请求和限制3.CPU 资源单位4.内存 资源单位5.示例 二、健康检查:又称为探针(Probe)1.定义2.探针的三种规则:3.Probe支持三种检查方法4.示例 …

一位autosar开源爱好者(非本博主)

https://github.com/autoashttps://github.com/autoas该爱好者 Email: paraifoxmail.com 另外在https://club.rt-thread.org/ask/question/a124ee65268bed5f.html 汽车电子嵌入式操作系统符合Autosar规范的静态os:GaInOS 发布于 2013-01-03 22:09:11 …

vite + vue3 + js 搭建组件库 + 核心配置与使用

vite.config.js 这个官网有写 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path" // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],server:{open:true, //自动打开浏览port:8088 //默认…

「大数据-0」虚拟机VMware安装、配置、使用、创建大数据集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

机器学习(18)---朴素贝叶斯

朴素贝叶斯 一、概述1.1 概率分类器1.2 贝叶斯工作原理1.3 贝叶斯的性质 二、sklearn中的朴素贝叶斯2.1 贝叶斯分类器2.2 高斯朴素贝叶斯GaussianNB2.3 探索贝叶斯:高斯朴素贝叶斯擅长的数据集2.4 探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度 一、概…

Three.js 实现导出模型文件(.glb,.gltf)功能 GLTFExporter

Three.js提供了导出(.glb,.gltf)文件的API GLTFExporter 用于实现场景内容导出模型文件的功能 导出模型文件主要使用 parse 方法,该方法接收三个参数: 1.scene:要导出的场景对象。 2.onComplete:解析完成…

Deformable DETR(2020 ICLR)

Deformable DETR(2020 ICLR) detr训练epochs缩小十倍,小目标性能更好 Deformable attention 结合变形卷积的稀疏空间采样和Transformer的关系建模能力 使用多层级特征层特征,不需要使用FPN的设计(直接使用backbone多层级输出&a…

cgroup version jdk version k8s

bug info: in centos, linux 3.10, cgroup:v1, service works well. in ubuntu 22.04 LTS, linux 5, systemd:v2, service is always crash on boot, or running some minutes then killed by OOM. deploy.yaml文件相关内容: specify limits:memory 1000M in yaml, killed …

区域气象-大气化学在线耦合模式(WRFChem)在大气环境领域实践技术应用

随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因…

Redis缓存相关问题

目录 缓存穿透 缓存雪崩 缓存击穿 Redis集群方案 主从复制Replication 哨兵sentinel 高可用介绍 Redis sentinel介绍 Redis sentinel使用 配置sentinel 启动sentinel 测试sentinel Redis内置集群cluster Redis cluster介绍 哈希槽方式分配数据 Redis cluster的…

ubuntu18.04 编译edk2项目下的intel架构bios

看了国内的edk2编译文章. 大不部分都是编译 用于虚拟机(qemu)或者模拟器上运行的 很少有编译edk2项目 出 真机的 bios 希望本文章对你有帮助, 请注意 github,com因为被墙了. 所有需要用gitee代替 参考来源 https://gitee.com/binout/edk2-platforms/tree/master https:/…

PHP8的类与对象的基本操作之类常量-PHP8知识详解

php 8引入了一种新的特性,称为类常量(class Constants)。类常量是在类中定义的常量,类似于全局常量,但作用域仅限于定义它们的类。 在PHP 8中,类常量的作用域被限制在定义它们的类中。这意味着只有类的成员…

【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

uploadifive上传工具php版使用

uploadifive自带的DEMO文件。 下载地址&#xff1a; http://www.uploadify.com/download/ <!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>UploadiFive Test&…