计算机网络-传输层提供的服务

传输层在协议栈中的位置

我们可以给应用层的这些应用程序提供我们想要传输的数据,比如说我们想用微信传一张图片,或者想用QQ发一串字符。那这些数据是由我们用户直接提供的,那么我们的数据交给了应用层的某一个进程之后。这个进程可能会在我们提供的这个数据前面加一些应用层的首部信息。

应用层的首部H5,这个部分有可能存在,也有可能不存在,具体来说就是取决于应用程序的实现逻辑。

比如说微信传一张照片,也许微信的开发者认为在这个照片的数据的前面需要增加一些有必要的信息,比如说这张照片是什么时候发送的?以及这张照片的大小?还有这张照片的格式等等。有可能微信的开发者认为这些信息有必要写在H5,也就是应用层的首部这个位置。那在这种情况下H5这个部分的数据就会存在。

换一个例子,假设QQ的这个应用程序开发者认为如果用户给我丢来一张照片的数据。那么,我不需要在这张照片前面加任何东西,我只需要直接把这张照片通过这个传输层的TCP协议或者传输层的udp协议传给另一个QQ进程就可以了。

所以如果说应用程序的开发者,他认为在这个用户数据的前面没必要加任何东西的话,那么事实上这个应用程序。可以直接把用户数据直接交给这个传输层的TCP或者udp进行传输。

那如果传输层使用的是TCP协议。那么H4这个部分添加的就是TCP协议的首部。而如果采用的是UDP协议,那么H4这个部分添加的就是udp的首部。那具体来说这两种协议的首部的格式定义是不一样的。

那在传输层这个地方,无论使用的是TCP还是udp协议,反正最终这一整块的数据,

都会交给网络层进行下一步的封装。那具体来说就是交给网络层的IP协议。IP协议会把传输层交过来的这一整块数据,封装成一个IP数据报。

那么这就是传输层在协议栈当中的地位,它为上层即应用层提供服务。同时,传输层又需要使用到网络层的IP协议所提供的服务。

在网络层那个部分学过的NAT路由器就引入了传输层端口号的概念。我们说一个IP地址可以标记网络当中的某一台特定的主机。所以网络层可以通过源IP地址和目的IP地址这两个信息去完成IP数据报在主机和主机之间的这种传输。然而,一个IP数据报到达一台主机还不够,最终IP数据报所携带的数据肯定还得交给上面的某一个应用进程。那此时传输层的端口号就会发挥作用,我们可以给主机上面的一个进程绑定一个端口号。并且同一台主机上的不同的进程它们的端口号都是不重复的。那这样的话,我们就可以用主机的IP地址,加上这台主机上某一个特定进程的端口号。用这两个信息去精确的指向网络当中的某一台主机上面的某一个特定的进程。

传输层就是通过端口号来区分数据来自哪个进程以及去往哪个进程的。所以传输层在网络层之上基于源端口号和目的端口号这两个特性实现了端到端的通信,也就是进程到进程之间的通信。

进程、端口号、传输层协议之间的关系

这里需要补充一些和端口号相关的知识。

假设这儿有一台主机a和主机b,它们分别拥有各自的IP地址。假设主机a上面的进程一正在和主机b的进程五进行网络通信。并且这两个进程的通信是使用了TCP协议。紧接着进程二和进程六也在进行通信,它们俩之间的通信也使用TCP协议。进程三和进程七之间也正在进行这个数据通信,只不过他们俩之间采用的是udp协议。进程四和进程八之间也在进行通信,它们俩之间使用的也是udp协议。

这几个数字代表的就是端口号。也就是说进程一绑定的是TCP协议的250这个端口号。而进程二绑定的是TCP协议的777这个端口号。进程三绑定的是udp协议的32端口号。

从这两个图当中,我们会发现,两台主机的端口号是相互独立的

比如说左边这台主机a它的进程二绑定了777这个端口,右边这台主机的进程七也在使用777这个端口。左边这台主机,它在使用113这个端口,右边这台主机它的进程六也在使用113这个端口。

所以端口号这个东西是每一台主机自己的一个资源。只要确保主机内部端口号别重复就行,但是不同的主机当中端口号重复是可以被允许的。

TCP和UDP的端口号也是相互独立的。像右边主机B的进程五和进程八。可以看到,这两个进程,前者使用的是TCP协议,后者使用的是UDP协议。前者使用的是886端口,后者使用的也是886这个端口。二者使用的端口号是相同的。但是由于他们在传输层对应的协议各不相同。所以这两个看起来相同的端口号其实并不冲突。比如说当进程一和进程五需要通信的时候,它需要指明这样的三个信息。

①首先要指明我们这两个进程的通信采用的是什么协议。按照这个图来说,就是采用TCP协议。

②还需要指明本进程绑定的端口号250,这个是进程一绑定的端口号。绑定了这个端口号,就意味着接下来如果进程五想要给进程一发送数据。那么就往166.1.1.1这个IP地址的TCP协议当中的250这个端口发送数据就行了。所以一个进程要和另一个进程通信的时候,需要给自己绑定一个端口。用于接收对方给我发过来的这个数据。

③第三个要指明的信息就是。我要和对方通信,那么对方的这个IP地址还有端口号是多少?那么在这个图当中。进程五的IP地址是231.2.2.2,端口号是886。

那由于双方采用的是TCP协议,所以进程一给进程五发送的这个数据。会从进程一的TCP到达进程五的TCP,然后再去检查这个端口号886。于是这个数据就可以顺利的送到进程五。

也就是说,虽然UDP这边同样也在使用886端口,但是在传输的过程当中,可以根据现在使用的是TCP还是UDP协议去区分这个数据到底是应该从TCP往886这边去递交还是从UDP往886这边去递交

所以可以看到两个协议的端口号是相互独立的。

在刚才这个过程中,我们梳理了两个进程要通信的时候需要指明哪些信息。

接下来思考这样的一个问题。两个进程之间的通信有可能会传输一系列的数据。那如果每一次发送数据给另一个进程的时候,我都需要在自己的代码当中写明对方的IP地址端口号,并且再写明使用的是什么协议,每一次都重复去写这些东西那么对于写代码的人来说会很麻烦。为了让代码变得简洁,因此在C语言、C++当中定义了这样的一个数据结构,叫做套接字。英文叫socket。那套接字分为TCP套接字和UDP套接字。比如进程一和进程五之间它们要采用TCP协议进行通信。那么在进程一的这个代码当中就可以创建一个TCP套接字。

在这个数据结构当中去指明接下来要和我进行通信的这个进程,它的IP地址等于多少?以及它对应的端口号等于多少?那这样的话,接下来如果两个进程之间需要有多次这种数据传输。在写代码的时候就可以直接用套接字这个数据结构去说明我的这个传输方向是什么就可以了。也就是说,程序员在写代码的时候,就不必每一次都说使用的是什么协议、要跟哪个IP哪个端口通信。不用每次都去重复这些参数。

这是套接字的作用本质上它就是一个数据结构,而这个数据结构,它的作用就类似于一个网络指针(可以去这么理解)。它指向了网络当中将要和本进程通信的另一个进程。

这是套接字的概念。

值得一提的是,在套接字这个数据结构当中,除了包含IP地址和端口号,其实还包含了其他的一些重要的信息。那由于本文主要是在学习理论,而不是在学习编程,所以其他的东西我们就暂时不做拓展。有兴趣的同学可以自己去搜一下C语言或者C++的socket套接字在实际写代码的时候应该怎么使用。

总结:通过上文的学习,我们认识到了端口的作用,我们可以用端口号去标识主机上的一个特定的进程。那值得注意的是,每台主机的端口号都是相互独立的。另外,在同一台主机上,TCP和UDP两种协议的端口号也是相互独立的。无论是采用TCP还是UDP协议,在C语言和C++语言当中进行网络编程的时候都会使用到这个套接字这个数据结构。一个套接字包含了IP地址和端口号,这两个重要的信息。那通过这两个信息就可以唯一的去标识网络中的一台主机上面的一个特定的进程。

有了端口这个概念之后,传输层就可以实现端到端的通信,这个功能也就是实现进程到进程之间的通信。

参考资料:25王道计算机网络

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

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

相关文章

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg,将红框内路径修改为自己电脑的“Notepad.exe路径”后,再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…

vue3二次封装UI组件

直接上代码 <template><el-uploadclass"lth_upload":action"${baseUrl}/file/upload":headers"uploadHeader"v-bind"$attr"><template v-for"(_, key) in $slots" #[key]"valueData"><slot…

存储引擎技术进化

B-tree 目前支撑着数据库产业的半壁江山。 50 年来不变而且人们还没有改变它的意向 鉴定一个算法的优劣&#xff0c;有一个学派叫 IO复杂度分析 &#xff0c;简单推演真假便知。 下面就用此法分析下 B-tree(traditional b-tree) 的 IO 复杂度&#xff0c;对读、写 IO 一目了…

vscode | 开发神器vscode快捷键删除和恢复

目录 快捷键不好使了删除快捷键恢复删除的快捷键 在vscode使用的过程中&#xff0c;随着我们自身需求的不断变化&#xff0c;安装的插件将会持续增长&#xff0c;那么随之而来的就会带来一个问题&#xff1a;插件的快捷键重复。快捷键重复导致的问题就是快捷键不好使了&#xf…

mysql如何发现慢查询sql

mysql如何发现慢查询sql tail -n 10 /data/mysql/mysql-slow.log

vm.max_map_count 表示啥意思啊?通俗易懂点,有单位么?262144表示啥意思?

背景&#xff1a;ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines-CSDN博客 vm.max_map_count 是一个 Linux 内核参数&#xff0c;用于限制一个进程可以拥有的最大内存映射区域数量。内存映射&#xff08;Memory Mapp…

00后整顿职场!一个人的底层逻辑,就是他的命运——早读(逆天打工人爬取热门微信文章解读)

00后整顿职场 引言Python 代码第一篇 洞见 一个人的底层逻辑&#xff0c;就是他的命运第二篇 百股跌停结尾 想看爽文情节的后续 引言 昨天晚上基本悟了 空空如也 之前听过一句话 非有之有为秒有 非空之空为真空 大致意思是 事物虽然没有独立不变的自性&#xff08;非有&#…

NR cell配置SUL时,RA要在哪个carrier进行?

当一个NR小区配置了 SUL 后&#xff0c;其接入所需参数&#xff0c;包括 SUL 的频段、PointA、SCS 子载波间隔&#xff0c;带宽等&#xff0c;会通过 SIB1 下发给UE。 如上图所述&#xff0c;配置有SUL的小区进行RA时&#xff0c;网络可以明确告知UE使用SUL还是UL。例如通过PDC…

安全成为大模型的核心;大模型安全的途径:大模型对齐

目录 安全成为大模型的核心 大模型安全的途径:大模型对齐 人类反馈强化学习(RLHF) 直接偏好优化(DPO) 安全成为大模型的核心 大模型安全的途径:大模型对齐 大模型对齐技术(Alignment Techniques for Large Language Models)是确保大规模语言模型(例如GPT-4)的输…

视频一键转换3D:Autodesk 发布 Video to 3D Scene

Video 3D Scene 最近 Autodesk 旗下公司 Wonder Dynamics 推出了 Wonder Animation 的测试版&#xff0c;它使用突破性的视频到 3D 场景技术&#xff0c;通过将任何视频序列转换为 3D 动画场景来加速动画电影的制作。 Video 3D Scene Video 3D Scene 生成效果 作为 Wonder Stud…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类&#xff1a;物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一&#xff0c;连续图像和离散图像的概念 二&#xff0c;图像的采样 1&#xff0c; 不同采样频率采样同一张图…

【MongoDB】Windows/Docker 下载安装,MongoDB Compass的基本使用、NoSQL、MongoDB的基础概念及基础用法(超详细)

文章目录 Windows下载MongoDB Compass使用NoSQL的基本概念MongoDB常用术语MongoDB与RDBMS区别MongoDB的CRUD 更多相关内容可查看 Docker安装MongoDB可查看&#xff1a;Docker-安装MongoDB Windows下载 官网下载地址&#xff1a;https://www.mongodb.com/try/download/communi…

二 MyBatis入门程序

二、MyBatis入门程序 2.1 MyBatis入门程序开发步骤 写代码前准备&#xff1a; 准备数据库表&#xff1a;汽车表t_car&#xff0c;字段包括&#xff1a; id&#xff1a;主键&#xff08;自增&#xff09;【bigint】car_num&#xff1a;汽车编号【varchar】brand&#xff1a;品牌…

网络自动化02:基于xlsx传入设备信息与所需执行备份配置命令,使用netmiko自动化登录分发

这是这个系列第二篇 本文将仅简单介绍使用xlsx导入设备信息&#xff0c;并使用netmiko配置 目录 环境设备信息表格式单线程代码解释代码逻辑分析函数解析 逻辑调用图逻辑说明 遇到的问题写在最后 环境 所有设备均能与我执行Python脚本的环境互通&#xff0c;同时均拥有独立的ip…

自动化测试类型与持续集成频率的关系

持续集成是敏捷开发的一个重要实践&#xff0c;可是究竟多频繁的集成才算“持续”集成&#xff1f; 一般来说&#xff0c;持续集成有3种常见的集成频率&#xff0c;分别是每分钟集成、每天集成和每迭代集成。项目组应当以怎样的频率进行集成&#xff0c;这取决于测试策略&…

C语言——八股文(笔试面试题)

1、 什么是数组指针&#xff0c;什么是指针数组&#xff1f; 数组指针&#xff1a;指向数组的指针 指针数组&#xff1a;数组中的元素都是指针 2、 什么是位段&#xff0c;什么是联合体 位段&#xff08;Bit Field&#xff09;&#xff1a;在C语言中&#xff0c;允许在一个整数…

制作一个简易恒流电子负载教程,实战教程,单片机程序,电路图,方案

师从&#xff1a;https://www.bilibili.com/read/cv4088568/ 题目是这样的&#xff1a; 设计和制作一台恒流&#xff08;CC&#xff09;工作模式的简易直流电子负载。其原理示意图如图1所示。 图1简易直流电子负载原理示意图 二、要求 1.基本要求 &#xff08;1&#xff09;…

日期类数据和控件管理

目录 QTime API QDate API QDateTime QDateTimeEdit API QCalendarWidget API 测试样例&#xff08;参考了《Qt6开发指南》&#xff09; (严肃提示&#xff1a;笔者认为这里的控件没有难点&#xff0c;本篇文章实际上是GPT辅助的代码整理和表格使用&#xff0c;笔者建…

scala中json转换问题

问题&#xff1a; scala中对象转json字符串报错 提示&#xff1a;scala中get和set方法实现与java中的不一样。 Error:(26, 10) ambiguous reference to overloaded definition, both method toJSONString in class JSON of type (x$1: Any, x$2: com.alibaba.fastjson.serial…

PostgreSQL-06-入门篇-集合运算

文章目录 1. UNION 组合多个查询的结果集简介带有 ORDER BY 子句的 UNION设置样例表PostgreSQL UNION 示例1) 简单的 PostgreSQL UNION 示例2) PostgreSQL UNION ALL 示例3) 带 ORDER BY 子句 UNION ALL 示例 2. INTERSECT 取交集简介带 ORDER BY 子句的 INTERSECT 操作Postgre…