1. 首页
  2. 综合百科
  3. 网络协议是如何实现的(网络协议基本原理)

网络协议是如何实现的(网络协议基本原理)

简介:关于网络协议是如何实现的(网络协议基本原理)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

进程间通信实际上是通过内核的数据结构完成的,主要用于linux上两个进程之间的通信。然而,一旦我们超越了一台机器,我们就需要一种机制来跨进程通信。

一台机器将想要表达的内容,按照一定的约定格式发送出去,当另一台机器接收到信息时,也可以按照约定的格式进行分析,从而准确可靠地获得发送者想要表达的内容。这种商定的格式称为网络协议。

搭建如下场景:Linux服务器A和Linux服务器B不在同一网段,使用中间的Linux服务器作为路由器进行转发。

说到网络协议,首先要了解两种网络协议模型,一种是OSI标准的Layer 7模式,另一种是行业标准的TCP/IP模型。它们的对应关系如下图所示:

为什么网络是分层的?

由于网络环境过于复杂,它不是一个可以集中控制的系统。

世界上数以亿计的服务器和设备都有自己的系统,但它们可以通过同一套网络协议栈划分为多个层次和组织,以满足不同服务器和设备的通信需求。

这里我们简要地介绍几层网络协议。(1)让我们从第三层开始,网络层。

网络层也称为IP层,由IP地址组成

连接到网络的每个设备至少有一个用于定位该设备的IP地址。IP主机类似于互联网的邮寄地址,具有全球定位功能

例如,你要访问美国的一个地址,你可以从附近的网络开始,不断问路,经过多个网络,最后到达目的地址,类似于快递员投递包裹的过程。路由协议也被第三次使用,称为路由协议。把网络数据包从一个网络转发到另一个网络的设备叫做路由器。

一般来说,第三层所做的就是网络数据包从一个起始IP地址,沿着路由协议所指示的路由,经过多个网络,经过多个路由器转发,到达目的IP地址

(2)从第三层往下可以看到数据链路层

数据链路层可以称为第二层或MAC层

所谓MAC,就是每个网卡都有一个唯一的硬件地址(不是绝对唯一,相对大概率唯一,就像UUID)。这也是一个地址,但是这个地址不具有全局状态

就像给你送饭的小弟弟一样,根据手机尾号是不可能找到你的家的,但手机尾号有局部定位功能,但这种定位主要靠“吼”。当快递员到达你的楼层时,他开始大喊:“xxxx,你的快递到了!”

MAC地址定位功能仅限于一个网络,即同一网络号的IP地址。MAC地址可用于相互定位和通信。如果要从IP地址中获取MAC地址,则通过ARP协议在本地发送广播报文来获取MAC地址

由于同一网络中只有有限数量的计算机,使用MAC地址的优点是简单。如果MAC地址匹配,则接收i。如果MAC地址不匹配,则不接收I。没有像路由协议这样复杂的协议。当然,缺点是MAC地址不能扩展到本地网络之外。因此,尽管IP地址保持不变,但MAC地址在路由器每次通过网络时都会发生变化。

让我们看看前一张图。服务器A向服务器b发送网络报文,原始IP地址为192.168.1.100,目的IP地址为192.168.2.100。但在网络1中,路由器的原MAC地址为MAC1,目的MAC地址为MAC2。报文经过路由器转发后,原MAC地址为路由器的MAC3,目的MAC地址为MAC4。

因此,第二层是网络数据包在本地网络中的服务器之间定位和通信的机制

(3)从第二层往下是第一层,物理层,这一层就是物理设备。就像网线一样

第三层以上是传输层,它由TCP和UDP这两个众所周知的协议组成。

在IP层的代码逻辑中,只负责数据从一个IP地址到另一个IP地址,丢包、乱序、重传、拥塞,这些IP层并不关心。处理这些问题的代码逻辑写在传输层TCP协议中

TCP是一种可靠的传输协议:因为第1层到第3层是不可靠的,网络数据包在一个字掉下来时就丢失了。它是TCP层通过各种编号、重传等机制,使原本不可靠的网络向上层“看起来”可靠

(5)从第四传输层开始,必须区分网络数据包发送到哪个应用程序。在传输层,TCP和UDP都有端口的概念。不同的应用程序侦听不同的端口。

应用层与内核的互通机制,是通过套接字系统调用的。插座属于哪一层?实际上,它不属于任何一层,它属于操作系统的概念,不属于网络协议层的概念。但是操作系统为网络协议选择的实现方式是,两到四层处理代码在内核中,七层处理代码让应用程序来做,两者都需要跨内核状态和用户状态通信,需要一个系统调用来完成连接,这就是套接字

网络分层后,数据包的发送就是一层一层封装的过程。

如下图所示:

部署在linux服务器B上的服务器nginx和tomcat通过socket监听80和8080端口。此时,内核的数据结构是已知的。如果它遇到发送到这两个端口的消息,它就被发送到这两个进程

在Linux服务器A的客户端上,打开到Ngnix的Firefox连接。同样通过Socket,客户端被分配一个随机端口12345。类似地,打开一个Chrome连接到Tomcat,并通过Socket分配随机端口12346。

在客户端浏览器中,我们将请求封装为HTTP协议,并通过套接字将其发送到内核。在内核的网络协议栈中,TCP层创建了用于维护连接、序列号、重传和拥塞控制的数据结构。HTTP报文加入TCP层发送到IP层,IP层加入IP层发送到MAC层,MAC层加入硬件网卡发送

网络数据包首先到达网络1上的交换机。交换机通常被称为第二层设备,因为交换机只处理第二层。然后它从网络数据包上取下MAC头,发现目标MAC就是它右边的网口,然后通过这个网口发送数据包

linux路由器左边的网卡收到网络报文后,发现MAC地址匹配,将报文发送到IP层。IP层根据IP报头信息查找路由表中的下一跳和报文应该从哪个网口发出。在这种情况下,它会从正确的网口输出。路由器通常被称为第3层设备,因为它只处理第3层

从路由器右侧网口发出的报文会进入网络2上的交换机,或者经过二层处理后被转发到交换机右侧网口

最终网络数据包被路由到linux服务器B,服务器B发现MAC地址匹配,删除MAC报头,并将其交给上层。IP层检测到IP地址匹配后,删除IP报头提交给上层。TCP层根据TCP报头中的序列号判断TCP报文是正确的网络报文,并将网络报文缓存在应用层读取。

应用层通过套接字监听端口,内核读取网络报文时,根据TCP报头中的端口号将网络报文发送给相应的应用程序

HTTP层的消息头和消息体由应用层解析。通过解析,应用层知道客户机正在请求什么,例如,购买一个商品或请求一个Web页面。当应用层完成对HTTP请求的处理后,它将结果封装为HTTP网络数据包,并通过Socket接口将其发送给内核。

内核被层层封装,从物理网口通过网络2上的交换机发送到网络1,Linux路由器通过网络1上的交换机发送到Linux服务器A。在Linux服务器A上,报文被解封装后,根据客户端的随机端口号,通过socket接口发送到客户端的应用程序和浏览器。然后浏览器会显示一个彩色的页面。

套接字接口大多在传输层操作,不必担心底层协议,这是分层的好处。

传输层有两种主流协议,TCP和UDP,所以我们的套接字程序设计主要是在这两种协议上进行的。这两种协议有什么不同?通常的答案是这样的

TCP是面向连接的,UDP是无连接的

TCP提供可靠的传输、无错误、无损失、可重复和顺序到达;UDP不提供可靠的传输,不保证不丢失,不保证顺序到达

TCP是面向字节流的,发送是一个流,没有结束;UDP是面向数据报的,一个一个发送

TCP提供流量控制和拥塞控制功能,防止对端无法承受,防止网络无法承受

这些答案并没有错,但它们并没有触及问题的本质,而且它们经常会误导人。例如,像这样的问题:

0

我正在中国访问一个美国网站。当有这么多链接时,我如何保持连接?

中间一个网络管理员拔了一根网线是不是断了?我控制不了它,它也不告诉我。我怎样才能保持电脑连接?

还让我做流量控制和拥塞控制,我既管理不了中间的链路,也管理不了对面的服务器啊,我该怎么做呢?

根据网络层,TCP和UDP都是基于IP的协议,IP不能保证可靠,都说丢了,TCP怎么能保证?

当IP层一个一个地发送数据包时,TCP如何变成一个流?

连接本质上,所谓连接的建立,实际上是为了维护客户端和服务器之间的连接,并建立一定的数据结构来维护双方交互的状态,并利用这些数据结构来保证连接的面向特性。TCP不允许任何左右中间通道。没有虚拟连接,中间通道不知道两端使用的是TCP还是UDP。

所谓连接,就是数据结构两端的状态协调,双方的状态可以匹配。符号表示TCP规则,则认为该连接存在。如果双方不匹配,则连接断开

流量控制和拥塞控制是根据收到的网络报文调整两端数据结构的状态。TCP协议设计理论,所以调整数据结构的状态,就可以进行流量控制和拥塞控制,其实在信道上是真的做到了,没人在乎。

“可靠”是指两端的数据结构所做的工作。事实上,不丢失是数据结构中的“命名”,事实上,顺序到达是数据结构中的“排序”,事实上,面向数据流的数据结构是分散的数据包,以便将流捏到应用层。总之,“连接”二字让人以为功夫在路上,其实是两头的。

当然,无论使用套接字来操作TCP,还是UDP,都必须先调用套接字函数。

Int套接字(Int域,Int类型,Int协议);socket函数为套接字创建唯一标识套接字的文件描述符。我们称其为文件描述符,因为在内核中,我们创建了类似文件系统的数据结构,并将它们用于后续操作。socket函数接受三个参数。

domain:使用的IP层协议。AF_INET表示IPv4, AF_INET6表示IPv6。

Type: socket类型。SOCK_STREAM,顾名思义,是面向TCP流的,SOCK_DGRAM是面向UDP数据报的,SOCK_RAW可以直接在IP层或非TCP和UDP协议上操作。例如ICMP。

protocol协议,包括IPPROTO_TCP和IPPTOTO_UDP。

当通信结束时,我们关闭套接字,就像关闭文件一样。

针对TCP应该如何编程

TCP服务器监听端口。它通常调用bind来为套接字分配端口和IP地址:

(Int sockfd, const struct sockaddr *addr,socklen_t addrlen);结构sockaddr_in;Struct in_addr;其中sockfd是我们上面创建的套接字文件描述符。sockaddr_in结构中,sin_family被设置为AF_INET,即IPv4。Sin_port是端口号;其中sin_addr为IP地址。

服务器所在的服务器可能有多个网络适配器和地址。可以选择一个地址监听,0.0.0.0表示监听所有地址。服务器通常监听一个众所周知的端口。

为了访问服务器,客户端必须首先调用服务器端口。当然,只有客户端主动去连接别人,别人不会主动去连接客户端,没有人关心客户端在哪里监听,所以客户端不需要绑定。

上面代码中的数据结构的变量名中有字母“be”,意思是“大端典”。如果网络传输超过1字节,则必须区分大端字节和小端字节。

假设我们想将整数1存储在一个32位的4字节空间中。很明显,对于其他3个字节,只有1个字节和0可以做到。问题是,我是在最后一个字节放1,还是在第一个字节放1 ?或者1应该是32位中的最后一个,还是第一个?

最后一个位置的最低的地方叫小端,第一个位置的最低的地方叫大端。TCP/IP栈被设计成大端方式,而x86基本上是小端方式,因此需要在发布时进行转换。

接下来,需要建立TCP连接,这也被称为三次握手。实际上,客户端和服务器的状态通过网络进行了三次通信,因此初始状态是协作的。

接下来,服务器调用listen以进入listen状态并等待客户端连接。

Int监听(Int sockfd, Int backlog);连接建立过程称为三次握手,是在内核中完成的TCP层操作,不涉及应用层。

然后,服务器只需调用accept并等待内核在返回之前至少建立一个连接。如果没有连接完成三次握手,则接受等待。如果多个客户端发起连接,并且完成了多个三向握手,并且在内核中建立了多个连接,那么这些连接将被放置在一个队列中。Accept从队列中取出一个进行处理。如果希望进一步处理其他连接,则需要多次调用accept,因此accept往往处于循环中

(Int sockfd, struct sockaddr *addr, socklen_t *addrlen);接下来,客户端可以通过connect函数发起连接。(Int sockfd, const struct sockaddr *addr, socklen_t addrlen);我们首先在参数中指定要连接的IP地址和端口号,然后发起三次握手。内核为客户端分配一个临时端口。一旦握手成功,服务器接受返回另一个套接字。这里需要注意的是,监听套接字和用于传输数据的实际套接字是两个套接字,一个称为监听套接字,另一个称为已连接套接字。连接建立成功后,双方通过读写功能开始读写数据,就像写入文件流一样。

接下来让我们看看如何编程UDP。UDP是无连接的,因此不需要三次握手,因此不需要调用侦听和连接,但UDP交互仍然需要IP地址和端口号,因此需要绑定。

使用UDP,不存在连接维护、连接发起者和接收者,甚至客户端和服务器。我们既是客户又是服务器。只要有一个套接字,多台机器就可以任意通信,不存在两台机器属于同一个连接概念。因此,每个UDP套接字都需要bind。每次通信时,sendto和recvfrom都会被调用,并传入IP地址和端口

源链接:

https://blog.csdn.net/zhizhengguan/article/details/121640391

作者:网络

在IT行业从业近20年的IT老手。常年潜伏在国企、一二线工厂。硬件集成入行,直到虚拟技术、容器化。有系统集成、DBA、全栈开发、sre、项目经理、产品经理、部门主管经验。

针对UDP应该如何编程

IT资源聚合门户:https://www.98dev.com

主要短视频平台:98dev

主要技术论坛博客:IT运维技术圈

长视频教学工作:《波哥讲网络》 《波哥讲git》

小程序:IT面试精华

建立技术社区:+V itboge1521加入学习交流群

本文主要介绍了关于网络协议是如何实现的(网络协议基本原理)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/1447218.html