计算机网络(运输层)

物理层、数据链路层以及网络层共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机与主机之间的通信。

实际上在计算机网络中进行通信的真正实体事位于通信两端主机中的进程。

运输层的任务就会是提供运行在不同主机上的应用进程提供直接的通信服务,又称端到端协议。

根据应用的需求不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP。

运输层端口号、复用、分用

TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。

端口号用16比特表示,取值范围0~65535

端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同的端口号是没有联系的。

复用和分用:发送方的某些应用进程所发送的不同应用报文,在运输层使用UDP协议进行封装,称为UDP复用。使用TCP协议进行封装称为TCP复用。

TCP/IP体系的应用层常用协议所使用的运输层熟知端口号

UDP和TCP的区别

UDP(User Datagram Protocol)用户数据报协议

·UDP是无连接的

·UDP支持单播、多播以及广播

·UDP是面向应用报文的

·UDP向上层提供无连接不可靠传输服务(适用于IP电话、视频会议等实时应用)

·UDP用户数据报首部仅8字节

TCP(Transmission Control Protocol)

·TCP是面向连接的(三次握手连接,四次挥手释放连接)

·TCP仅支持单播

·TCP是面向字节流的

·向上层提供面向连接的可靠传输服务(例如文件传输)

·TCP报文首部最小20字节,最大60字节

TCP流量控制

流量控制(flow control)让发送方的发送速率不要太快,让接收方来得及接收,利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

·TCP接收方利用自己的几首窗口的大小来限制发送方发送窗口的大小

·TCP发送发收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文。

TCP拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况叫拥塞(congestion)。如果对于拥塞不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。TCP四种拥塞算法:慢开始(slow-start),拥塞避免(songestion avoidance),快重传(fast retransmit),快恢复(fast recovery)

·判断拥塞窗口cwnd的维护原则:只要没有网络拥塞,拥塞窗口就尽量大些,出现拥塞,窗口就小一些。

·判断出现拥塞的依据:没有按时收到确认报文

·发送方将拥塞窗口作为发送窗口swnd,swnd=cwnd

维护一个慢开始门限ssthresh状态变量:

(1)当cwnd<ssthresh时,使用慢开始算法

(2)当cwnd>ssthtesh时,停止使用慢开始算法而改用拥塞避免算法

相等时,都可以使用。

一开始使用慢开始算法,拥塞窗口指数比列增大,增大到慢开始门阀值时,停止使用慢开始算法,该规律加+1,当传输报文出现问题时,重传计时器超时时,网络很可能出现了拥塞:

(1)将ssthresh值更新为发生拥塞时cwnd值的一半;

(2)将cwnd值减少为1,并重新开始执行慢开始算法

有时,个别报文段会在网络中丢失,但实际上网络并没有拥塞,会导致发送方超时重传,并误认为网络发生了拥塞。降低了传输效率。

采用快重传可以让发送方尽早知道发生了个别报文段的丢失。快重传就是使发送方尽快重传,而不是等超时计时器超时再重传。

·要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认。

·即使收到失序的报文段也要立即发出对已收到的报文段的重复确认。

·发送方一旦收到三个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。

发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法。

整体流程

超时重传时间的选择

针对出现超时重传时无法测准往返时间RTT的问题,Karn提出了一个算法:在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。也就是出现重传时,不计算RTTs,进而超时重传时间RTO也不会重新计算。报文段每重传一次,就把超时重传时间RTO增大一些。

TCP可靠传输的实现

TCP基于以字节为单位的滑动窗口来实现可靠传输

可以使用三个指针来描述发送窗口的状态。

虽然发送方的发送窗口是根据接收方的就诶和搜窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的窗口一样大。(网络传送窗口值需要经历一定的时间滞后,并且这个时间是不确定的,发送方还可以根据网络拥塞状况是大哥减小自己的发送窗口)

TCP通常对不按序到达的数据是先临时存放在接收窗口中,等到字节流中多缺少的字节收到后,再按序交付上层的应用进程。

TCP要求接收方必须有累积确认和捎带确认机制,这样可以减小传输开销。接收方可以在何时的时候发送确认,也可以在自己有数据要发送时把确认信息顺便带上。(接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,会浪费网络资源)。

TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此。每一方都有自己的发送窗口和接收窗口。

TCP的运输连接管理

TCP连接的建立

TCP的连接建立主要解决以下三个问题:

(1)使TCP双方能够确知对方的存在。

(2)使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项)

(3)使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

使用“三报文握手”建立连接。

TCP的序号和确认号
32位序号 seq:Sequence number 缩写seq ,TCP通信过程中某一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。
32位确认号 ack:Acknowledge number 缩写ack,TCP对上一次seq序号做出的确认号,用来响应TCP报文段,给收到的TCP报文段的序号seq加1。

TCP的标志位
每个TCP段都有一个目的,这是借助于TCP标志位选项来确定的,允许发送方或接收方指定哪些标志应该被使用,以便段被另一端正确处理。
用的最广泛的标志是 SYNACK 和 FIN,用于建立连接,确认成功的段传输,最后终止连接。

    ·SYN:简写为S,同步标志位,用于建立会话连接,同步序列号;

  • ACK: 简写为.,确认标志位,对已接收的数据包进行确认;

  • FIN: 简写为F,完成标志位,表示我已经没有数据要发送了,即将关闭连接;
  • PSH:简写为P,推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
  • RST:简写为R,重置标志位,用于连接复位、拒绝错误和非法的数据包;
  • URG:简写为U,紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;

第一次握手:

客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=J,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=J+1,随机产生一个序号值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

第三次握手
客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用三报文握手而不是二报文握手为了防止已经失效的连接请求报文突然又传送到TCP服务器,因为导致错误。

  • 小写的ack代表的是头部的确认号Acknowledge number, 缩写ack,是对上一个包的序号进行确认的号,ack=seq+1。
  • 大写的ACK,则是我们上面说的TCP首部的标志位,用于标志的TCP包是否对上一个包进行了确认操作,如果确认了,则把ACK标志位设置成1。

TCP的连接释放

  • 第一次挥手: Client端发起挥手请求,向Server端发送标志位是FIN报文段,设置序列号seq,此时,Client端进入FIN_WAIT_1状态,这表示Client端没有数据要发送给Server端了。
  • 第二次挥手:Server端收到了Client端发送的FIN报文段,向Client端返回一个标志位是ACK的报文段,ack设为seq加1,Client端进入FIN_WAIT_2状态,Server端告诉Client端,我确认并同意你的关闭请求。
  • 第三次挥手: Server端向Client端发送标志位是FIN的报文段,请求关闭连接,同时Server端进入LAST_ACK状态。
  • 第四次挥手 : Client端收到Server端发送的FIN报文段,向Server端发送标志位是ACK的报文段,然后Client端进入TIME_WAIT状态。Server端收到Client端的ACK报文段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

建立连接时因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。所以建立连接只需要三次握手。

由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式
这就意味着,关闭连接时,当Client端发出FIN报文段时,只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段,表示它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会立即关闭SOCKET,直到Server端把数据也发送完毕。
当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

TCP报文段的首部格式

源端口:占16比特,写入源端口号,用来标识发送该TCP报文段的应用进程。

目的端口:占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程。

序号字段:占32比特,序号增加到最后一个后,下一个序号就又回到了0.(指出本TCP报文段数据载荷的第一个字节的序号)。

确认号字段:占32比特,确认号增加到最后一个后,下一个确认号就又回到0。(指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。)

确认标志位置ACK:取值为1时确认号字段才有效;取值为0时确认号字段无效。(TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1)

数据偏移字段:占4比特,并以字节为单位(指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,实际上指出了TCP报文段的首部长度)

窗口字段:占16比特,以字节为单位。(指出发送本报文段的一方的接收窗口,窗口值作为接收方让发送方设置其发送窗口的依据,以接收方的接收能力来控制发送方的发送能力,称为流量控制)

校验和:占16比特,检查范围包括TCP报文段的首部数据载荷两部分。

同步标志位SYN:在TCP连接建立时用来同步序号

终止标志位FIN:用来释放TCP连接

复位标志位RST:用来复位TCP连接(当RST=1时,表明TCP连接出现了异常,必须释放连接,然后再重新建立连接)

推送标志位PSH:接收方的TCP收到该标志位为1的报文段会尽快上交应用进程。

·最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度。

·窗口扩大选项:为了扩大窗口

·时间戳选项:

(1)用来计算往返时间RTT

(2)用来处理序号超范围的情况,又称为防止序号绕回PAWS。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pybind11 学习笔记

pybind11 学习笔记 0. 一个例子1. 官方文档1.1 Installing the Library1.1.1 Include as A Submodule1.1.2 Include with PyPI1.1.3 Include with Conda-forge 1.2 First Steps1.2.1 Separate Files1.2.2 PYBIND11_MODULE() 宏1.2.3 example.cpython-38-x86_64-linux-gnu.so 的…

常见 HTTP 状态码详解与Nginx 文件上传大小限制

在我们日常使用 Nginx 搭建网站或应用服务时&#xff0c;可能会遇到很多与文件上传和请求响应相关的问题。今天我们就来聊聊 如何限制文件上传的大小&#xff0c;并介绍一些常见的 HTTP 状态码 及其在 Nginx 中的处理方式。 一、文件上传大小限制 有时&#xff0c;我们需要限…

从入门到精通,玩转Python的print函数(探索Python print函数的隐藏功能)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 基础用法参数详解示例📝 高级用法自定义分隔符和结束符输出到文件追加模式📝 覆盖打印与进度条简单覆盖打印动态进度条示例代码⚓️ 相关链接 ⚓️📖 介绍 📖 刚开始学习编程时,我们接触到的第一个方…

【初阶数据结构】一文讲清楚 “堆” 和 “堆排序” -- 树和二叉树(二)(内含TOP-K问题)

文章目录 前言1. 堆1.1 堆的概念1.2 堆的分类 2. 堆的实现2.1 堆的结构体设置2.2 堆的初始化2.3 堆的销毁2.4 添加数据到堆2.4.1 "向上调整"算法 2.5 从堆中删除数据2.5.1 “向下调整”算法 2.6 堆的其它各种方法接口函数 3. 堆排序3.1 堆排序的代码实现 4. TOP-K问题…

微软Office全家桶再爆办公革命,o1模型加持重塑十亿人工作流!1句话生成PPT+自定义智能体

颠覆全球十亿打工人的Office办公全家桶&#xff0c;昨夜迎来重磅升级&#xff01; 在微软Copilot第二弹发布会上&#xff0c;CEO纳德拉官宣&#xff0c;「用AI构思&#xff0c;共同协作的全新工作流——WebWorkPages正式开启」。 全程半小时&#xff0c;每一幕都在透露着&…

GPT代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

基于JDK1.8和Maven的GeoTools 28.X源码自主构建实践

目录 前言 一、GeoTools与Jdk的版本关系 1、GeoTools与Jdk版本 2、编译环境简介 二、使用Maven编译GeoTools28.X 1、GeoTools28.x 2、Maven的完整编译 3、构建时的问题 三、总结 前言 想要学习和掌握一个开源软件或者项目&#xff0c;源码是我们主要学习的内容。学习开…

JDBC笔记

文章目录 准备MySQL数据的建立和建表 idea 建工程和模块设置属性配置文件编写JDBC代码URL的设置JDBC 代码配置文件 准备MySQL 数据的建立和建表 idea 建工程和模块 设置属性配置文件 编写JDBC代码 URL的设置 JDBC 代码 package com.yanyu;import java.sql.*; import java.util…

vue2.0+ts注册全局函数和几个递归查找

vue2.0ts注册全局函数和几个递归查找 一、main.ts 一、main.ts // 定义你的全局函数,判断是否有按钮权限 interface Item {label: string;checked: number;[k: string]: any; } // 获取按钮时候权限 function globalLable(arr: Item[], label: string): boolean {for (const i…

硬件基础知识

驱动开发分为&#xff1a;裸机驱动、linux驱动 嵌入式&#xff1a;以计算机技术为基础&#xff0c;软硬结合的、可移植、可剪裁的专用计算机 单片机最小单元&#xff1a;vcc gnd reset 晶振 cpu --- soc :system on chip 片上外设 所有的程序都是在soc&#xff08;cpu&…

1.熟悉接口测试(Postman工具)

一、接口及其类型 API&#xff0c;应用编程接口&#xff0c;简称接口 通过接口&#xff0c;可以让程序和程序之间&#xff0c;能够互相交互。 接口分为两大类&#xff1a; 1&#xff09;基于TCP全双工&#xff08;适用于postman&#xff09; 2&#xff09;基于HTTP半双工 二、…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

普罗米修斯监控

目录 概念 部署方法 1. 二进制&#xff08;源码包&#xff09; 2. 部署在k8s集群当中&#xff0c;用pod形式部署 概念 prometheus是开源的系统监控和告警。在k8s分布式的容器化管理系统当中&#xff0c;一般都是搭配prometheus来进行监控。它是服务监控系统&#xff0c;也…

git reflog 和 git log 的详解和区别

文章目录 1. git log 介绍基本用法&#xff1a;输出内容&#xff1a;常见选项&#xff1a;git log 的局限性&#xff1a; 2. git reflog 介绍基本用法&#xff1a;输出内容&#xff1a;git reflog 输出字段&#xff1a;常见选项&#xff1a;主要用途&#xff1a;示例&#xff1…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为&#xff1a; 接下来我们将对其中较重要的部分进行介绍。 4位版本&#xff1a;这里的四位版本只有两个取值 分别为IPv4和IPv6&#xff0c;这两个额分别为不同的IP协议&#xff0c;但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

【机器学习】OpenCV高级图像处理

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OpenCV高级图像处理图像滤波线性滤波高斯滤波均值滤波双边滤波 非线性滤波中值滤…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)

1.存储结构 https://cplusplus.com/reference/vector/vector/ namespace zone {template<class T> //需要模板class vector{public:private:iterator _start;iterator _finish;iterator _endofstorage;}; } 可见&#xff0c;vector内核是由三个指针实现的 2.默认成员函…

LabVIEW机械产品几何精度质检系统

随着制造业的发展&#xff0c;对产品质量的要求越来越高&#xff0c;机械产品的几何精度成为衡量其品质的重要指标。为了提高检测效率和精度&#xff0c;开发了一套基于LabVIEW的几何精度质检系统&#xff0c;该系统不仅可以自动化地进行几何尺寸的测量&#xff0c;而且能实时分…

高校宿舍电费管理怎么实现

1引言 在大学的象牙塔里&#xff0c;宿舍不仅是学子们休憩的港湾&#xff0c;更是青春记忆的重要载体。然而&#xff0c;随着科技的发展与生活习惯的改变&#xff0c;宿舍内的电器设备日益增多&#xff0c;电费管理成为了一个不可忽视的问题。本文将从高校宿舍电费管理的现状出…

ORA-28032 Your password has expired and the database is set to read only

做个记录。 non-cdb 处于只读状态&#xff0c;CDB创建到noncdb的dblink后产生的报错&#xff0c;dblink可以成功创建&#xff0c;但无法连接到non-cdb。 解决&#xff1a;一开始以为是cdb的密码不正确&#xff0c;mos上找到问题&#xff0c;non-cdb的密码过期了&#xff0c;并且…