计算机网络 —— 运输层

news2024/9/27 23:35:07

运输层

5.1 运输层概述

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

在这里插入图片描述

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

5.2 运输层端口号、复用与分用的概念
端口号

运行在计算机上的进程使用进程标识符PID来标志。但是因特网上的计算机并不是使用统一操作系统,不同的操作系统(windows,linus,Mac OS)又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用程序之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识

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

端口号使用16比特标识,取值范围0~65535

  • 熟知端口号:0~1023,IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP使用80,DNS使用53。
  • 登记端口号:1024~49151,为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。例如:MySQL 使用的端口是 3306。
  • 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。

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

发送方的复用和接收方的分用

发送方的某些应用进程所发送的不同应用报文,在运输层使用UDP协议进行封装,这称为UDP复用。而另一些应用进程所发送的不同应用报文,在运输层使用TCP协议进程封装,则被称为TCP复用

运输层采用端口号区分不同的应用进程,不管是使用运输层UDP协议封装成的UDP用户数据报,还是使用TCP协议封装成的TCP报文段,在网络层都需要被IP协议封装成IP数据报,这被称为IP复用

IP数据报首部中协议字段的值用来表名IP数据报的数据载荷部分封装的是何种协议数据单元。

  • 取值为6,表示封装的是TCP报文段
  • 取值为17,表示封装的UDP报文段

接收方的网络层收到IP数据报后进行IP分用。若IP数据报首部中协议字段的值为17,则把IP数据报的数据载荷部分所封装的UDP用户数据报上交运输层的UDP。若协议的字段为6,则把IP数据报的数据载荷部分所封装的TCP用户数据报上交运输层的TCP。运输层对UDP用户数据报进行UDP分用,对TCP报文进行TCP分用。根据端口号将它们交给上层相应的应用进程。

在这里插入图片描述

5.3 UDP 和 TCP 的对比

在这里插入图片描述

5.4 TCP 的流量控制

一般来说,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制(flowcontrol)就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

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

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

  • ACK: TCP报文段首部中的标志位,取值1表示这是一个TCP确认报文段。
  • ack: TCP报文段首部中的确认号字段,取值201表示序号201之前的数据已全部正确接收,现在希望收到序号201及其后续数据。
  • rwnd:是TCP报文段首部中的窗口字段,取值300表示自己的接收窗口大小为300

在这里插入图片描述

假设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些存储空间。于是主机B向主机A发送了接收窗口等于300的报文段。然而这个报文段在传输过程中丢失了。

主机A一直等待主机B发送的非零窗口的通知。

主机B也一直等待主机A发送的数据。

如果不采取措施,这种互相等待而形成的死锁局面将一直持续下去。

为了解决这个问题,TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器超时,就发送一个零窗口探测报文,仅携带一字节的数据。而对方在确认这个探测报文段时,给出自己现在的接收窗口值,如果接收窗口值仍为0,那么收到这个报文段的乙方就重新启动持续计时器。

如果接收窗口不是0,那么死锁的局面就可以被打破。

5.5 TCP 的拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降

在这里插入图片描述

慢开始

拥塞窗口在小于慢开始门限值时按照指数增加

在这里插入图片描述

拥塞避免

拥塞窗口在大于慢开始门限后每次加一,如果出现丢失,慢开始门限折半,拥塞窗口大小变为1。重新进行慢开始

快重传

在这里插入图片描述

快恢复

在这里插入图片描述

在这里插入图片描述

5.6 TCP 超时时间重传的选择

RTT:往返时间

RTO:超时重传时间

在这里插入图片描述

5.7 TCP 可靠传输的实现

在这里插入图片描述

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

  • 发送方在未收到接收方的确定时,可将发送窗口内还未发送的数据全部发送出去。
  • 接收方只能接收序号落入发送窗口内的数据

虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的接收窗口和接收方的接收窗口并不总是一样大

  • 网络传送窗口值需要经历一定的时间滞后,并且这个时间还是不确定的。
  • 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸。

对于不按时序到达的数据应该如何处理,TCP并无明确规定。

  • 如果接收方把不按时序到达的数据一律丢弃,那么接收窗口的管理将会比较简单,但这样做对网络资源的利用不利,因为发送方会重复传送较多数据。
  • TCP通常对不按时序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按时序交付上层的应用程序

TCP要求接收方必须有累计确认和捎带确认机制,这样可以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。

  • 接收方不应该过分推迟发送确认,否则会导致发送方不必要的超时重创,这反而浪费了网络的资源。TCP标准规定,推迟延迟的时间不应超过0.5秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认。
  • 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据

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

5.8 TCP 的运输连接管理

TCP是面向连接的协议,它基于运输连接来传送TCP报文段。

TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。

TCP运输连接有以下三个阶段:

  1. 建立TCP连接
  2. 数据数据传输
  3. 释放连接

TCP的运输连接管理就是使运输连接的建立和释放都能正常地进行。

5.8.1 TCP 的连接建立

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

  1. 使TCP双方能够确知对面的存在
  2. 使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选择以及服务等)
  3. 使TCP双方能够运输实体资源(如缓存大小、连接表中的项目等)进行分配

TCP报文中的字段

SYN:首部中的同步位

ACK:首部中的确认位

ack:确认号字段,主机甲对主机乙中TCP客户进程所选择的序列号seq的确认

seq:主机对另一个主机中TCP服务进程所选择的初始序号,可由TCP服务器随意制定

三次握手

  1. TCP客户端进程向服务端进程发送TCP请求报文段。

  2. 当TCP服务端收到请求报文后,若同意连接,则向TCP客户端进程发送TCP连接请求确认报文段,并进入同步接收状态。

  3. TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务端进程发送一个普通的TCP确认报文段,并进入连接已建立状态。

  4. 当TCP服务端收到报文段后也进入连接已建立状态,至此连接建立。

在这里插入图片描述

采用三报文握手而不是二报文握手的目的是为了防止已失效的连接请求报文段突然又传送到了TCP服务器

在这里插入图片描述

5.8.2 TCP 的连接释放

TCP的四次挥手

  1. TCP客户进程发送TCP连接释放报文段,并进入终止等待1状态
  2. TCP服务端收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。TCP服务端进程这时应通知高层应用进程:TCP客户端进程要断开与自己的TCP连接。此时从TCP客户端到TCP服务端进程这个方向的连接就释放了,这时的TCP属于半关闭状态,从TCP服务端进程到TCP客户端进程这个方向的连接并未关闭。
  3. TCP客户端进程收到TCP确认报文字段后就进入终止等待2状态,等待TCP服务端进程发出的TCP连接释放报文段
  4. 若使用TCP服务器进程的应用程序已经没有数据要发送了,应用程序就通知其TCP服务端进程释放连接。TCP服务进程发送TCP连接释放报文段并进入最后确认状态
  5. TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段。之后进入时间等待状态,经过2 MSL后才能进入关闭状态
  6. TCP服务端进程收到该报文段后就进入关闭状态

在这里插入图片描述

TCP保活计时器

TCP双方已经建立了连接,突然TCP客户端进程发生了故障,通过计时器,可以使TCP服务端进程发现这种状况。

在这里插入图片描述

5.9 TCP 报文的首部格式

为了实现可靠传输,TCP采用面向字节流的方式。但TCP在发送数据时,是从发送缓存取出一部分或全部字节并给其添加一个首部使之成为TCP报文段后进行发送。

  • 一个TCP报文段由首部和数据载荷两部分构成;
  • TCP的全部功能都体现在它首部中各字段的作用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

VBA(学习笔记)

1. 数据类型 变量定义:Dim 变量名 As 数据类型 变量赋值:变量名 值 1.1 数值型 1.1.1 整数 (1) Byte:1字节(0~255) (2) Integer:2字节(-32768~32767) (3) Long:4…

ubuntu18.04下zookeeper安装与简单使用

下载与解压 官网下载地址 Apache ZooKeeper 解压 tar -zxvf zookeeper-3.4.10.tar.gz 环境准备 zookeeper基于java开发,因此首先需要安装java的jdk包 sudo apt-get install openjdk-8-jdk修改配置 进入解压目录里的conf文件夹内 mv zoo_sample.cfg zoo.cfg …

表单进阶(6)-字段集

带框的字段集用fieldse &#xff0c;字段集标头用legent 选中的样式&#xff1a; 圆点用radio&#xff0c;方框用checkbox <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

Qt QListwidget与QStackedWidget或QTableWidget实现多界面切换的效果

文章目录 效果图使用QStackedWidget实现使用QTableWidget实现总结 效果图 使用QStackedWidget实现 QStackedWidget提供了一种堆栈式的界面布局方式。功能&#xff1a;QStackedWidget允许开发者在一个固定区域内显示多个子窗口或页面&#xff0c;但同时只显示其中一个子窗口&am…

腾讯云轻量服务器流量用完了怎么办?还能继续用吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额部分的流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xf…

【大厂AI课学习笔记NO.75】人工智能产业的就业岗位分布

见上图&#xff0c;这是详细的人工智能产业的就业岗位分布情况。 就业领域包括物联网、智能芯片、机器学习、深度学习、计算机视觉CV、自然语言处理NLP、智慧语音、机器人、知识图谱等领域。 人工智能作为当今科技革命与产业变革的重要驱动力量&#xff0c;其就业岗位分布广泛…

什么是Python网络爬虫

Python网络爬虫是一种自动化获取网页内容的程序。它可以通过发送HTTP请求&#xff0c;获取网页的HTML代码&#xff0c;并从中提取所需的数据。下面是一个简单的概述&#xff0c;帮助您理解Python网络爬虫的基本原理。 导入所需的库&#xff1a; 在Python中&#xff0c;我们可以…

系统架构设计师精讲班视频教程

本课程将深入探讨系统架构设计原理及实际应用。学员将学习高可用性、扩展性和安全性等方面的设计技巧&#xff0c;掌握微服务架构、云计算和容器化等最新趋势。通过案例分析和项目实践&#xff0c;帮助学员成为系统架构设计领域的专家。 课程大小&#xff1a;7G 课程下载&…

20240310-1-Java后端开发知识体系

Java 基础 知识体系 Questions 1. HashMap 1.8与1.7的区别 1.71.8底层结构数组链表数组链表/红黑树插入方式头插法尾插法计算hash值4次位运算5次异或运算1次位运算1次异或运算扩容、插入先扩容再插入先插入再扩容扩容后位置计算重新hash原位置或原位置旧容量 (1) 扩容因子…

SpringMVC09、Ajax

9、Ajax 9.1、简介 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 Ajax 不是一种新的编程语言&#xff0c;而是一种用于创建更好更快以及交互…

第十五届蓝桥杯模拟考试III_物联网设计与开发

编程题 一、基本要求 使用大赛组委会提供的四梯/国信长天物联网省赛套装&#xff08;基于STM32L071KBU微控制器设计&#xff09;&#xff0c;完成本试题的程序设计与调试。程序编写、调试完成后&#xff0c;选手需提交两个LoRa终端对应的hex文件&#xff0c;LoRa终端A对应的文…

解决轻松解决谷歌浏览器火狐浏览器主页被360导航篡改问题浏览器启动页被篡改为360导航栏等

重置Chrome浏览器设置 尝试重置chrome浏览器全部设置。进入Chrome设置页&#xff0c;点击最下方的“高级设置”。 将鼠标滚到最底部&#xff0c;点击“重置设置” 然后关闭浏览器&#xff0c;重新打开即可。 包括ie几乎所有浏览器都可以重置... 重置火狐浏览器设置 设置——主…

VUE+HBuilder的uniapp技术路线开发应用使用总结

使用总结 本来想做一个记录日常数据的应用&#xff0c;主要在Android端使用&#xff0c;后来发现在uniapp中使用sqllite数据库不是像原生中那样简单(所以当前准备去进行另一个路线&#xff0c;就是给我使用的电脑都安装一个portalble的服务端&#xff0c;用来记录数据&#xf…

linux环境下线程的介绍和POSIX线程接口应用实例

目录 概述 1 线程概念 1.1 线程的特性 1.2 线程的运行状态 2 线程API 2.1 pthread的数据类型 2.2 pthread函数的返回值 2.3 POSIX线程接口 2.3.1 创建线程函数pthread_create 2.3.2 终止线程 2.3.3 线程ID 2.3.4 连接已终止线程 2.3.5 线程分离 3 线程VS进程 4 线…

电子电器架构 —— 车载网关路由表和刷写场景

电子电器架构 —— 车载网关路由表和刷写场景 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有…

leetcode 热题 100_搜索二维矩阵

题解一&#xff1a; 二叉搜索树&#xff1a;从矩阵右上角观察&#xff0c;结构类似二叉搜索树&#xff0c;因此可以用类似的解法来做。具体做法是双指针从右上角开始&#xff0c;向左下角逐步搜索&#xff0c;如果当前值比目标值大&#xff0c;则向下移动&#xff0c;如果当前值…

MQ高可用相关设置

文章目录 前言MQ如何保证消息不丢失RabbitMQRocketMQKafkaMQ MQ如何保证顺序消息RabbitMQRocketMQKafka MQ刷盘机制/集群同步RabbitMQRocketMQKafka 广播消息&集群消息RabbitMQRocketMQ MQ集群架构RabbitMQRocketMQKafka 消息重试RabbitMQRockeMqKafka 死信队列RocketMQKaf…

Linux网络套接字之TCP网络程序

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、接口介绍 1.socket 2.listen 3.accept…

conda 设置国内源 windows+linux

默认的conda源连接不好&#xff0c;时好时坏&#xff0c;而且速度很慢&#xff0c;可以使用国内的源 如果没有安装conda&#xff0c;可以参考&#xff1a; miniconda安装&#xff1a;链接 anaconda安装winlinux&#xff1a;链接 windows使用命令提示符&#xff0c;linux使用…

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…