初识linux之简单了解TCP协议与UDP协议

news2024/11/26 8:25:31

目录

一、理解源IP地址和目的IP地址

二、端口号

1. 为什么要有端口号

2. 理解端口号

3. 源端口号和目的端口号

三、初步了解TCP协议和UDP协议

1. 初步认识TCP协议

2. 初步认识UDP协议

3. 可靠传输与不可靠传输

四、网络字节序

1. 网络字节序的概念

2. 如何形成网络字节序

2.1 大小端转化


一、理解源IP地址和目的IP地址

源IP和目的IP在上一章网络基础中就已经有所讲解,这里就简单的介绍一下。在IP数据包头部中,包括两个IP地址,分别是源IP地址目的IP地址源IP地址就是发送数据的主机的IP地址目的IP地址就是最终要接收这份数据的主机的IP地址。

在网络中发送数据时,必须要有源IP和目的IP这两个IP地址,用于标识这份数据从哪儿来,要到哪儿去。这就好比你去旅游时,必须要有一个出发地和目的地,否则这趟旅游就无法开始。

二、端口号

1. 为什么要有端口号

要了解端口号,首先要建立如下一个概念:

网络中两台主机通信时,真正需要通信的并不是主机,而是这两台主机中的应用层的程序需要通信,需要通过传输的这份数据来实现某种业务。所以将数据从A主机传输到B主机并不是目的,而是手段。让这两台主机上的程序获取这份数据执行某项业务才是目的。

我们知道,在一台主机上可能存在数十上百个进程,而这份数据如何从这大量的进程中分辨出它应该传给谁呢?解决方案很简单,既然数据在传输过程中有唯一的IP来标识这份传入的数据的来源和目的地,就也可以通过一个唯一的数据来标识某个进程

因此,在网络中为了更好的表示一台主机上的进程的唯一性,就采用了端口号port来标识服务器进程和客户端进程的唯一性

2. 理解端口号

端口号和ip地址不同,ip地址网络层协议的内容,而端口号(port)传输层协议的内容。

端口号是一个2字节,即16位的整数。端口号用于标识一个进程,告诉OS,当前的这个数据要交给哪一个进程来处理。

在网络中,ip地址+端口号就能够唯一标识网络上的某一台主机的某一个进程

一个端口号只能被一个进程占用,即一个端口号对应一个进程。 

通过上面的ip地址标识主机和端口号标识进程的内容,我们就应该意识到,网络通信的本质,其实就是“进程间通信”

要进行进程间通信,就必须要有一份能够让这两个进程同时看到的共享资源,这份共享资源就是网络资源。

同时上面也说了,端口号是一个2字节的整数,如果所有主机中的进程都共用同一套端口号,就势必会出现端口号不足的情况。因此,不同主机其实都拥有一套单独的端口号,即不同主机上的端口号是可以相同的。因为ip地址就已经保证了该主机全网唯一(并不准确),那么端口号是不是全网唯一就已经不重要了,只需要保证有端口号和同一台主机下的端口号不重复即可。

上文中说网络通信的本质就是进程间通信,而端口号和ip地址分别属于传输层协议和网络层协议,而传输层和网络层又是属于OS的。同时我们也知道,在OS中,一个进程的唯一性可以用进程pid来标识。既然如此,那为什么这里要单独用端口号来标识进程唯一性,而不采用进程pid来标识呢?原因主要有以下三个:

(1)系统就是系统,网络就是网络。如果采用进程pid充当端口号,就会导致系统与网络的强耦合。为了避免这一情况,就需要将系统与网络解耦,即网络单独用端口号来标识进程唯一性。

(2)数据在网络中传输时,要求数据能够快速准确的找到对应的服务器进程。这就要求ip地址+端口号是不能随意改变的。而进程pid在进程重启后都会重新随机生成,增加了数据找到对应服务器进程的成本。

(3)不是所有的进程都需要提供网络服务和请求,但是所有进程都需要进程pid。例如我们的电脑中的某些单机游戏,从下载下来后就不会再进行联网操作,此时该进程就不需要提供网络服务,也就不需要端口号。

此时大家可能还会有一个问题。端口号是网络中用来标识进程唯一性的,而进程是由OS来管理的。那底层OS是如何根据这个端口号来找到对应进程的呢?我们知道,在OS中,每个进程都有一个进程pcb,是一个结构体。而端口号是一个2字节的整数,所以这个问题现在就转化为了如何通过一个16位的整数找到一个结构体。解决方案其实就是hash。建立一个kv模型的hash表,key值就是端口号,value则是对应进程的pcb。通过hash映射的方式,就可以通过端口号找到进程了

总结起来,要理解端口号,就要理解如下四个概念:

(1)网络通信的本质就是进程间通信。通过网络资源这一共享资源进行通信

(2)所有主机上都有一套独立的端口号,这就表示不同主机的端口号是可以相同的

(3)端口号和进程pid都是用来标识进程唯一性的,但端口号是用于网络中的,而进程pid则是用于OS中的

(4)OS通过hash映射的方式用端口号找到对应的进程

注意,上文中一直在说一个端口号标识唯一一个进程,但是并没有说一个进程只能对应一个端口号。在实际中,一个进程是可以绑定多个端口号的。大家应该听过“开后门”的事情。就是在网上有些人可能说某个程序员给别人写了一个程序,但这个程序员留了一个后门,在这个买程序的人拿了程序没给钱的时候,这个程序员就通过这个后门将他交付的程序中的数据全部删除了。这里的这个“后门”,其实就是指的端口号。即他交付的这个程序绑定了多个端口号,一些端口号是给买程序的人用的,而另一些端口号他则没有告诉用户,只要这些预留的端口号没被用户发现并清除,那么这个程序员就随时都可以通过这些端口号进入程序内部修改数据。

3. 源端口号和目的端口号

和ip地址存在源IP和目的IP两个IP地址一样,传输层协议的数据段中的端口号也存在“源端口号”“目的端口号”两个端口号,分别用于标识从哪里来和到哪里去。 

注意,在传输数据的过程中,不仅要将对方需要的数据传过去,还需要将自己的ip地址和端口号传过去。因为数据传输是相互的,对方也可能需要反馈数据。

此时有人可能就会疑惑了,既然接收方需要接收发送方的ip和port以便于返回数据,那发送方在最开始的时候是如何知道接收方的ip和port的呢?这其实因为我们所用的程序并不是由我们写的,而是由给我们提供程序的公司写的。这些程序发送数据时需要发送给给特定的服务器,而这些服务器的ip和端口号早已经在程序内被提前写好了,不需要用户操心。

三、初步了解TCP协议和UDP协议

大家知道,在网络中通过协议分层分为了5层,其中传输层和网络层属于OS,数据链路层是驱动相关的内容,物理层是硬件相关的内容。这四层都已经有对应的协议规定好了,不需要我们来操作。所以在网络编程中,我们所要做的基本都是在应用层进行操作。而数据传输是自顶而下的,这也就导致如果我们想在应用层操作,就势必需要使用系统调用接口与传输层建立关系

在传输层中主流的协议是TCP协议,还有一个使用比较少的协议,即UDP协议。在这里因为大家知识储量不够的原因,还不能详细讲解这两个协议,但可以建立一个对TCP协议和UDP协议的初步认识。

1. 初步认识TCP协议

TCP协议,全称为Transmission Control Protocol,即传输控制协议。主要包括以下四个特性:

(1)是传输层协议

(2)有连接

(3)可靠传输

(4)面向字节流

第一点,是传输层协议这个不比多说,TCP协议就是一个应用于传输层的协议。

第二点,有连接。这里的有连接指的是在正式通信之间,通信双方要先建立连接。这就好比我们打电话,只有当对方接听了电话,你们之间建立了一个沟通渠道后,才可以开始通话。如果对方没有接电话,就是建立连接失败。

第三点,可靠传输。数据在网络传输中是可能出现各种问题的,例如数据丢失、数据由于某些原因多发了一份、由于网络抖动导致数据发送失败等问题,这些问题就被称为“不可靠”。而这里的可靠传输就是指TCP协议中会有对应的可靠性方案来解决这些问题。至于解决这些不可靠的方案和过程,在应用层是感知不到的,因为用户并不关心这些,用户只关心数据是否传输成功。

第四点,面向字节流。对于流,大家可能并不陌生,就是数据从一个地方传输到另一个地方。但是字节流,大家应该并不了解。有人可能说自己以前学过文件读取,学过管道,对字节流有了解。确实,大家确实有了解,但这个了解也仅仅停留在知道有个东西叫做“面向字节流”,至于这个它是如何运行的,它会带来什么后果、它的数据是怎么提取的等等问题大家并不清楚。当然,在这里也没办法完全将面向字节流讲清楚,大家现在只需要知道TCP协议的一个特性就是面向字节流即可。

2. 初步认识UDP协议

 UDP协议,全称为User Datagram Protocol,即用户数据报协议。主要包括如下4个特性:

(1)是传输层协议

(2)无连接

(3)不可靠传输

(4)面向数据报

第一点,是传输层协议,不必多说。

第二点,无连接。无连接指的是发送数据时,两台主机直接不用建立联系。这就好比你的朋友给你的邮箱发信息,他只需要知道你的邮箱就可以给你发信息,不必等你响应。

第三点,不可靠传输。TCP协议可能会遇到的如数据丢失、网络抖动等问题,UDP协议同样会遇到。但不同的是TCP协议中有对应的可靠传输方案去解决,而UDP中则没有解决方案。

第四点,面向数据报。要理解面向数据报,首先就要理解面向字节流,将这两种方式进行对比后才能更清晰的认识到什么是面向数据报。这里因为大家对什么是面向数据流都不太理解,就不过多赘述。

大家可以通过下图来帮助记忆TCP协议和UDP协议的区别:

3. 可靠传输与不可靠传输

TCP协议是可靠传输,UDP协议则是不可靠传输。此时有人可能就就会疑惑,既然UDP协议无法保证数据传输的安全,那为什么UDP协议还没有被淘汰呢?大家要注意,这里的可靠与不可靠并没有褒贬之意,而是两个中性词

可靠传输固然可以保护数据传输的安全,但是那也是有代价的。数据在网络中可能会遇到各种各样的问题,TCP协议为了解决或缓解这些问题,就势必需要进行很多的处理,这也就导致TCP协议使用起来往往是比较复杂的。这个复杂就主要体现在维护和编码上。TCP协议的代码比较复杂,维护难度比较高。同时在使用时也可能需要程序员根据需求去自行制定解决问题的方案,编码上也比较困难。

UDP协议因为是不可靠传输,所以不必去考虑如何保护数据传输的安全。在维护和使用上都比较简单。

虽然TCP协议是目前传输层中最主流的协议,但在某些场景下也是可以使用UDP协议的。比如我们经常看的直播,它允许数据出现一定的丢包。例如调整清晰度其实就是允许传输的数据丢失一部分。这类场景就可以采用UDP协议。但是,在银行系统这种数据非常重要的情况下,就需要使用TCP协议对数据传输进行维护。

因此,TCP协议和UDP协议的使用仁者见仁智者见智,选择合适的场景去使用即可。

四、网络字节序

1. 网络字节序的概念

网络字节序,其实就是TCP/IP协议中规定好的一种数据表示格式。那么它有什么用呢?先来看下面的问题。

在以前大家都了解过计算机中存储数据时是有大小端之分。 在同一台主机中传输数据时,因为大小端统一,所以无需我们操心。但是,在网络中传输数据时是在两台不同的主机之间传输,这也就导致可能出现“大端机数据传给小端机”,或“小端机数据传给大端机”的情况:

当大端机的数据传给小端机时,小端机就会以小端的方式接收和识别数据,反之同理。此时就会导致读取到的数据是反的。有人可能会说,出现这种情况的时候直接将数据逆序不就可以了么。但是要知道,在这里的问题并不是逆序,数据逆序很容易解决,这里最大的问题是,接收方如何知道发送过来的数据是大端数据还是小端数据

为了解决这一问题,在TCP/IP协议中有了如下规定:

在网络中传输数据时,必须传输大端数据。即网络数据流采用大端字节序,即低地址高字节。

无论这台主机是大端机还是小端机,都会按照TCP/IP协议规定的网络字节序来发送/接收数据。如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略。

再来看数据发送时的数据地址情况。

发送主机通常将发送到缓冲区中的数据按内存地址从低到高的顺序发出。因此接收主机在把从网络上接收到的字节依次保存在接收缓冲区中时,也是按内存地址从低到高的顺序保存的。

由此,网络数据流的地址是这样规定的:先发出的数据是低地址,后发出的数据是高地址

大家可能对大端和小端有点不清楚,这里举一个例子。假设现在有0x12345678一串数字,将这串数字写到从0x0000开头的内存中。形式如下图所示:

注意,这里的高字节指的是位数,而不是数字大小。

因此,网络字节序其实就是用于保证不同主机之间可以不受大小端的影响而自由通信。

2. 如何形成网络字节序

网络字节序,要求在发送数据的主机中能够识别本台主机上的数据是大端还是小端,如果是小端就要进行转化。而接收数据的主机则需要能够将获取到的数据转化为与自己匹配的大端或小端。这个工作是非常繁琐复杂的,如果全部交由程序员来实现,无疑会比较耗时麻烦,并且不同程序员的实现方式不同,也可能出现兼容性的问题。

2.1 大小端转化

为了减轻程序员的负担,同时使网络程序具有可移植性,让同样的C代码在大端或小端的主机是都能够正常运行,OS中就提供了如下的几个函数来做网络字节序和主机字节序的转换:

这四个函数就可以用于网络字节序和主机字节序的互相转化。

这些函数的名字也很好理解。h表示host,即主机;n表示network,即网络;l表示long,即32位长整数;s表示short,即16位短整数。

上面的htonl就是将32位长整数的主机字节序转换为网络字节序htons就表示将16位短整数的主机字节序转换为网络字节序ntohl和ntohs则是分别将32位长整数或16位短整数的网络字节序转换为主机字节序

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。

如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

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

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

相关文章

python+django电子笔记交易系统vue

编码使用python(我的pycharm版本是2021.3.3),数据库使用mysql(我的mysql版本5.5)。网站点击能够跳转各个页面,不用部署服务器,本地运行即可。 题目:基于django的电子笔记交易系统 功…

并发编程的三大特性之有序性

有序性的概念 Java文件在被cpu执行前会进行编译成cpu可以执行的指令,为了提高cpu的执行效率会对其中的一些语句进行重排序。Java指令最终是乱序执行的目的是为了提高cpu的执行效率,发挥cpu的性能 单例模式由于指令重排可能会出现上述的问题&#xff0…

ASP.NET Core

1. 入口文件 一个应用程序总有一个入口文件,是应用启动代码开始执行的地方,这里往往也会涉及到应用的各种配置。当我们接触到一个新框架的时候,可以从入口文件入手,了解入口文件,能够帮助我们更好地理解应用的相关配置…

SOC与MCU的区别及汽车电子未来发展以及展望

SOC与MCU的区别及汽车电子未来发展以及展望 MCU与SOC的区别 CPU(Central Processing Unit),是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可…

【PHP】问题已解决:宝塔面板搭建php网站无法上传图片或是文件(保姆级图文)

目录 问题情况原因和解决方法总结 『PHP』分享PHP环境配置到项目实战个人学习笔记。 欢迎关注 『PHP』 系列,持续更新中 欢迎关注 『PHP』 系列,持续更新中 问题情况 宝塔面板搭建php网站无法上传图片或是文件。 原因和解决方法 检查你的php里是否安装…

老板让你写个PPT没有头绪?没事,ChatGPT来帮你!

文章目录 前言一、先确定写什么——准备内容二、再看看能用吗——自动生成PPT三、最后再改改——看个人喜好写在最后 前言 自从人工智能横空而出,它在人们的生活中产生了巨大的影响。尤其在企业办公领域,借助人工智能的力量,能够迅速产出丰富…

千乎万唤始出来,支持gpt3和gpt4支持画图,的在线gpt应用接入案例开源上线啦

了解OPEN AI 平台用户一直在说,这个接口要怎么对接,如何在体验。 由于我一直忙于接口中台开发,所以在线基于OPEN AI 接口实例例子就一直没有写。现在终于写完了。 基于纯HTMLCSSJS 小白也能轻松上手部署。代码简单清晰。 这里不多做其他赘述…

tensorflow及其keras如何保存模型

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

如何从宏观层面构建优秀的大语言模型

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

高阶python | 装饰器

python版本:3.10.0 在学习装饰器前先了解一下闭包 阿-岳同学【python技巧060】形象理解闭包,玩转闭包 通过视频首先可以了解到主要的三个知识点 闭包是嵌套结构内层函数有调用外层函数的变量为闭包,同时内层函数是闭包函数(所…

根据DataFrame1中指定列c1的每个值a1 从DataFrame2中指定列c2中的每个值a2 找到与a1最临近的值a2,进行所在行合并

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 根据DataFrame1中指定列c1的每个值a1 从DataFrame2中指定列c2中的每个值a2 找到与a1最临近的值a2,进行所在行合并 [太阳]选择题 关于以下代码说法错误的是: import pandas as pd…

新手应该如何快速上手MySQL数据库?

前言 数据库是计算机系统中用于存储、管理和检索数据的系统。它允许用户访问并管理数据,并具有可靠、可扩展和高效的特性。 文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置…

我在CSDN的736个日子——两年纪念日“随想”

2021-05-21~2023-05-27,我在 CSDN 已有 736 个日子。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 地址:https:/…

设计一:51单片机流水灯控制

目录 一、设计内容 二、硬件电路分析 三、仿真原理图 四、程序设计 五、仿真结果 六、思考题 作者有话说 一、设计内容 本次设计使用4个按键,当KEY1按下时,P0口所接的发光二极管(D1~D8)以100ms的时间间隔自下至上循环点亮3…

软考A计划-试题模拟含答案解析-卷六

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

在线Excel绝配:SpreadJS 16.1.1+GcExcel 6.1.1 Crack

前端:SpreadJS 16.1.1 后端: GcExcel 6.1.1 全能 SpreadJS 16.1.1此版本的产品中包含以下功能和增强功能。 添加了各种输入掩码样式选项。 添加了在保护工作表时设置密码以及在取消保护时验证密码的支持。 增强了组合图以将其显示为仪表图。 添加了…

chatgpt赋能python:Python成为行业中的主力之一

Python成为行业中的主力之一 Python作为一种高级编程语言,已经成为了行业中的主力之一。Python的功能强大,易于学习和使用,而且兼容性良好。在数据科学,人工智能,web开发等领域,Python已经成为了不可或缺的…

chatgpt赋能python:Python转化为数字:Python程序员必须知道的关键技能

Python 转化为数字:Python 程序员必须知道的关键技能 Python 是一种广泛使用的编程语言,不仅适用于数据科学、人工智能和机器学习领域,还可以用于一般的应用开发。在 Python 中,数字是最基本的数据类型之一,因此了解如…

arm3399主板-使用ubuntu20.04搭建LVS-DR(netplan)

目录 一、规划 1、网络拓扑 2、检查 二、配置设备 1、配置LVS 1.配置IP转发 2.清除防火墙 3.安装ipvsadm工具 4.配置VIP 5.netplan与NetworkManager介绍 6.添加LVS规则 1.清除防火墙 2.添加伪装IP 3.安装web服务 4. 修改内核参数,防止IP冲突 3、配置w…

Golang每日一练(leetDay0079) 最大正方形、完全二叉树节点数

目录 221. 最大正方形 Maximal Square 🌟🌟 222. 完全二叉树的节点个数 Count Complete Tree Nodes 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…