其实深入解析:现代网络通信协议技术与应用的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享深入解析:现代网络通信协议技术与应用的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
至此,OSI 7层参考模型和TCP/IP协议这两个术语已经解释清楚了。我们不会谈论OSI 7层参考模型中理论上的东西,比如每一层应该做什么。我们进入正题,先来说说已经实现的TCP/IP协议。
一般来说,TCP/IP协议分为“应用层”、“传输控制层”、“网络层”、“链路层”和“物理层”等层。例如,常见的“应用层”定义的协议包括HTTP协议、HTTPS协议、FTP协议、SSH协议等,这些应用中都会用到这些协议。 “传输控制层”包括TCP协议、UDP协议,“网络层”包括IP协议或与IP相关的一些协议。其中,‘链路层’有ARP协议,‘物理层’是计算机编程中在硬件上制定的一些协议,比如编解码器等。每一层都有自己的相关协议来规定和限制一些工作。至于事物,各层之间没有重叠,可以互相调用。这样就实现了TCP/IP协议。
至此,TCP/IP协议这个术语的语义已经解释清楚了。
OSI7层参考模型
TCP/IP 实现的OSI 7 层参考模型
二. TCP/IP协议之应用层
我们先不深入研究TCP/IP 协议。我们先来谈谈“应用层”。应用程序使用的那些协议,例如WEB工程师最常用的协议。 HTTP协议,SSH协议’,我们先看HTTP协议。那么什么是HTTP协议呢?比如我们的服务器和www.huangcuigang.cn的服务器之间请求页面的过程就需要HTTP协议。我们用一个简单的来演示,使用LINUX操作系统,这里有一些琐碎的知识点和概念。您必须仔细观察演示过程才能理解以下内容。比如先演示一下大家都看不懂的东西:
[root@iZbp19r2vmlr853x5azt4rZ ~]# exec 8/dev/tcp/www.huangcuigang.cn/80
这是我们编写的字符串的解释:
该字符串的第一部分是“exec”,它是一个命令(exec 命令)。 “exec”是“execute”一词的缩写。顾名思义,就是执行力的意思。简单理解一下这个命令就足够了。这不是我们演示的重点。只需知道它的作用,
字符串的第二部分是旁边有一个数字8(这个数字可以随便写,不一定是8)。 "" 是Shell 输入/输出重定向。这里我们将输入输出重定向到数字8。也就是说,这里的数字8可以是输入,也可以是输出,
字符串的第三部分是一个路径,它是一个文件目录,
让我们考虑一下这个字符串的语义。当我们按下回车键时,在Linux系统中,一切都是文件。例如,我们的打印机可以是一个文件。如果我们向这个文件写入一些内容,那么打印机就会打印出来。我们的相机可以是一个文件。当我们读取这个文件的时候,我们就会读出相机拍摄到的东西。
如果我们和www.huangcuigang.cn网站建立一个TCP连接,它的连接也是一个文件,那么对这个文件的读写就会对www.huangcuigang.cn网站的TCP连接造成一种输入和输出,在Linux中一切皆文件,所以该命令的语义是建立一个到www. Huangcuigang.cn网站80端口的TCP连接,并用数字8来代表TCP连接,数字代表的TCP连接8可输入或输出,
按回车键,终端不会有任何提示输出。没有提示就是最好的提示,说明成功。至此,我们就创建了一个编号为8的TCP连接对象,通过这个编号为8的TCP连接对象,我们可以同时获取输入流和输出流。你必须理解这个理论。
我们要演示的是HTTP协议。我们都知道HTTP协议是用来发送HTTP请求的。那么什么是HTTP协议呢?简单来说,HTTP协议是基于TCP/IP通信协议传输数据的规范。只能发送数据。发送方和接收方都遵守HTTP协议发送数据,双方都可以根据HTTP协议的约定解析出想要的数据。
我们现在在服务器上进行演示。我们必须用自己的双手来扮演浏览器的角色。当浏览器请求一个URL时,它必须根据HTTP协议请求创建一个文本内容。让我们使用echo 命令来打印它。本文内容(HTTP协议的所有细节这里不再详细讨论,主要目的是演示和解释)
小知识点: echo 的-e选项激活转义字符,意味着将n解析为换行符,而不是将n作为字符串打印。
[root@iZbp19r2vmlr853x5azt4rZ ~]# echo -e "GET/HTTP/1.0n"
获取/HTTP/1.0
[root@iZbp19r2vmlr853x5azt4rZ ~]#
我们现在使用echo 将字符串打印到终端。事实上,我们应该将这个字符串发送到www.huangcuigang.cn网站的TCP连接上。让我们再次改变我们的echo输出,使用""输出重定向将echo输出重定向到数字8。数字8代表我们的TCP连接之一,但这里的数字8实际上是一个文件描述符。要求输出重定向的对象是一个文件,输出重定向到文件描述符,使用"",数字8代表www.huangcuigang.cn网站的TCP连接。这样,这个echo输出的内容就被写入到TCP连接对象中了。
按回车键,我们就按照HTTP协议向www.huangcuigang.cn的TCP连接对象发送了一个请求。
[root@iZbp19r2vmlr853x5azt4rZ ~]# echo -e "GET/HTTP/1.0n" 8
根据HTTP协议,接收到消息后必须返回消息。我们向www.huangcuigang.cn的TCP连接发送的消息被写入到文件描述符8中,因此www.huangcuigang.cn的TCP连接的返回数据应该也是写入到文件描述符8中。我们可以得到通过读取文件描述符8的内容返回内容。这里我们使用cat命令来读取。 Cat plus 输出重定向从文件描述符读取数据。按Enter 键。
注意图中红色圈出的一些命令。使用cat 8读取文件描述符内容时,没有数据。我们需要注意这个问题。这是因为当我们再次写这篇文章时,需要花费很多时间。长,导致TCP连接断开。这里的知识点是,如果我们想要给对方发送数据,首先要和对方建立TCP连接。只有建立了TCP连接后,我们才能向对方发送数据。所以关键点在这里,我们已经和对方建立了连接,但是什么时候给对方发送消息是未知的。我们可能在建立连接后不久就向对方发送数据,也可能永远不会向对方发送消息,所以从www. Huangcuigang.cn服务器的角度思考,如果其他人与我们建立了连接,相当于我们创建了一个TCP连接资源,也是一个文件描述符。我从这个连接读取数据,也就是在做I/O操作时,对方还没有发送数据。首先,这会造成我们资源的浪费。其次,不断对文件进行I/O操作也是一种性能的浪费。再者,这可能会造成阻塞状态,所以才会出现BIO、NIO、复用等技术,所以这是完全没有意义的,所以连接就会断开。有兴趣的朋友可以想一下,如果没有超时,连接会自动断开。机制会发生什么变化?举个例子,如果我们写一个程序,使用不同的虚拟IP,与你的服务器创建大量的TCP连接但不发送数据,其实每个服务器能创建的连接是有限的,你的服务器会发生什么情况呢?那么再好的硬件也撑不住了。
现在TCP连接断开了,我们重新建立一个TCP连接不就可以了吗?至此,我们已经请求了www.huangcuigang.cn域名返回的页面数据。
这是一个屏幕截图。上半部分是www.huangcuigang.cn所在的服务器。 IP 为47.111.242.7。下半部分是发起请求的一方。 IP 为121.196.47.141。首先IP47.111.242.7使用tcpdump命令监控网卡。在IP121.196.47.141的数据包上,然后IP121.196.47.141使用exec命令创建TCP连接。每条数据前面都有一个时间。根据时间可以看到,20分28秒时,IP47.111.242.7与IP121.196.47.141完成了3次握手。然后,我们什么也没动。我们建立了TCP连接,并没有发送数据。 29分28秒,www.huangcuigang.cn所在服务器IP47。111.242.7向请求方IP 121.196.47.141发送数据包并完成4次分手,连接断开。
TCP/IP协议之应用层的总结 :
我使用HTTP协议请求服务器获取页面的演示。核心是HTTP协议。如果我们的"GET/HTTP/1.1n"不是按照HTTP协议的格式写的,那么我们将它发送到服务器。当然服务器我们也可以接收数据,但是服务器根本不知道我们要做什么,更不用说正确返回我们想要的数据了。再比如我们自己手写了一个xx程序,xx程序运行在服务器上。我们的xx程序监听系统的1314端口。我们xx项目开发了一套xx协议。 xx协议规定用我们的xx程序向TCP连接发送字符串‘操作:连接xx|账号:xxx|密码:xxx’格式。代表的是连接、登录操作,然后还有增删改查等操作,我们xx协议是有规定的。然后就需要连接并登录,我们的xx程序发送了一个字符串:"我要登录,我的账号是xx,密码是等等,让我再想想。我们的xx程序按照xx协议解析这样一个字符串。它无法知道你想做什么。当然它无法替你完成连接和登录。这就是应用层的协议完成。事情。
3. TCP/IP协议的传输控制层
通过上面我们已经知道,应用层只是完成一些用于各个应用程序之间通信的协议。创建TCP 连接并获取输入和输出流后,我们就完成了。至于数据如何发送出去,如何进行是的,我们根本不关心网卡进出什么,因为这些事情都交给了系统内核的TCP/IP协议层。 “传输控制层”控制数据如何传输以及以何种方式传输。传输,那么‘传输控制层’有哪些协议呢?常见的有TCP协议和UDP协议。这里我们只分析TCP协议。
什么是TCP协议?
简单的说,TCP协议是网络通信协议中的一种传输控制协议。 TCP的工作原理是将消息或文件分解成更小的片段(称为数据包)并通过互联网发送。然后,另一个TCP 层接收这些数据包,该层将数据重新组装成完整的文件或消息。 TCP还负责对数据流进行错误检查,以确保数据的传送;如果发现错误,TCP 会重新传输数据包。这保证了不同节点之间端到端的数据传输。 Internet 协议提供传输数据的指令,而TCP 创建连接并确保数据传送到正确的目的地。这两个协议通常一起工作,称为TCP/IP 协议。因此,TCP协议是一种面向连接、可靠的传输控制协议
这有引发一个新的问题 ,既然TCP协议是面向连接的 ,那么什么是连接?
这里的连接肯定不是物理连接,所以是虚拟连接。由于它是虚拟连接,因此不必担心“连接”一词。我们真正的问题是,TCP连接是通过什么形式来表示连接的?这就导致了“3次握手、4次分手”的过程。例如,如果客户端和服务器想要建立连接,客户端需要向服务器发送一个sync数据包,表示想要建立连接,服务器接收客户端发送的连接建立请求,并返回发送给客户端的sync+akc 数据包。 sync也表示服务器要与客户端建立连接,akc表示确认收到客户端的连接建立请求。该请求,此时仅完成了2次握手。服务器不确定自己发送给客户端的sync+akc是否已经被客户端正确接收。因此,此时客户端向服务器回复一个ack。表示已收到确认。此时,客户端和服务器端就完成了三次握手。双方都创造了资源来互相服务。这是某种意义上的联系。这里为对方服务的资源就是上面我们所拥有的。演示HTTP 协议时,创建TCP 连接看到的输入和输出流文件描述符。服务器的消息可以通过这个文件发送到客户端,客户端的消息也可以通过这个文件发送到服务器。这难道不是真正的意义吗?是否已连接?
简单的答案是,三次握手后为对方打开的资源就是连接。
socket
还有一件重要的事情。说到传输控制层,除了上面讨论的传输控制协议TCP协议和UDP协议之外,还有一个概念叫做socket。我个人理解socket本质上还是TCP协议,只是建立连接的方式不同。让我们使用命令netstat-natp 来了解套接字的感受。
在这里你可以明白很多事情。 Proto 列标识所使用的协议,Recv-Q 和Send-Q 列标识发送和接收的顺序。这就是重点。 Local Address和Foreign Address分别表示本地地址和对端地址。都是IP:Prot,也就是socket的概率。状态还标识套接字状态。我们简单了解一下这个状态。 LISTEN表示socket正在监听连接[调用listen后],ESTABLISHED表示已经进行了3次握手,连接已经建立。 CLOSE_WAIT 远程套接字已关闭:等待套接字关闭【被动关闭方收到FIN】,TIME_WAIT 套接字已关闭,正在等待远程套接字的关闭传输【FIN、ACK、FIN、 ACK全部Completed,这是主动方最后的状态,2MSL时间后转为CLOSED状态】,还有一些状态,这里不讨论,PID/Program name标识了进程ID和进程名时使用当前的套接字连接
这里我们看第3行PID为873的sshd进程。它是Linux系统上的一个服务进程,使用我们现在用来远程登录服务器的协议。现在是LISTEN状态,说明它处于监听状态,然后listen的是22端口,这个不是我们和服务器建立TCP连接后产生的。它一直都在那里。下面有两个sshd套接字连接进程,PID:8138和PID:7688。我们关注两者的状态,都表明已经进行了三次握手,连接已经建立。那是因为我们确实与服务器建立了两个连接。查看local Address和Foreign Address的值,服务器的本地地址是相同的,但是客户端的端口不同,说明客户端是两个进程连接我们服务器的22端口。这可以通过一个例子来理解。当我们使用浏览器访问www.huangcuigang.cn网站时,我们可以打开多个选项卡并访问同一个网站,但这些浏览器和服务器的标签实际上是不同的进程和不同的端口来与服务器建立的连接进行通信。这样,各自就有了自己的连接,各自的数据都可以发送到正确的一端。
聊到这里,新的问题又来了。从上面我们可以看到,服务器的22端口同时与我们的客户端创建了2个TCP连接。那么我们是否还有疑问,同一个端口号可以创建TCP连接呢?连接数没有上限。如果是的话,连接数上限是多少?
同一个端口号可以创建的TCP连接数有限制吗?
答案是肯定的,连接数有上限。我们可以使用ulimit -a 命令来检查。 ulimit -a 用于显示当前的资源限制设置。其中有很多。我们不需要全部解释。让我们看一下打开文件参数。该值为65535,表示进程可以创建的文件描述符的数量。换句话说,PHP 程序可以创建的变量或对象的数量。一切都是文件,套接字也是文件。使用文件描述符打开一个真实的文件,或者使用文件描述符打开一个设备。设备被抽象成一个文件,也是一个文件描述符,因此一个进程可以创建的连接数受到这个内核参数的约束。如果我们修改nginx配置文件,让一个nginx进程可以创建10万个连接,那就尴尬了,没有用,因为由于系统内核的限制,一个nginx进程只能向系统申请65535个文件描述符。或65535 个TCP 连接使用的文件描述符。当然,虽然我们的应用程序受到系统内核的限制,但是系统内核本身只是一个程序,所以内核限制值是可以改变的,但是65535本身就已经是最大值了
我们打印当前进程的fd目录。我们可以看到一开始只有0、1、2、255。一个进程必须有三个文件描述符:0、1、2。0是标准输入文件描述符,1是标准输出,2是错误输出,但是当我们创建TCP连接时,用8来表示文件描述符,多了8个文件描述符。也就是说,对于我们当前进程来说,这个fd目录下最多可以有65535个文件描述符。如果你打开一个新的SSH连接进程,检查自己进程的fd目录,没有文件描述符8。
所以,传输控制层还有一个重要的事情,就是断开连接,释放资源。系统本身可用的连接数量是有限的,断开连接就是四次分手的过程。
TCP/IP协议传输控制层总结:
到这里我们已经分析了TCP协议,有了3次握手、4次分手的宏观概念。传输控制层仅创建传输控制数据包。重点是控制。传输控制层本身无法完成数据包向他人的传输,所以下面还有其他层
4. TCP/IP协议网络层
接下来是传输控制层。传输控制层本身不能传输数据包。数据包的传输必须交给网络层。当我们谈论网络层时,就会出现IP协议。我先问一个问题。
IP有什么作用? IP解决什么问题?
IP 用于寻址和解决端到端问题。互联网上有很多计算机。没有IP,谁能知道如何传输数据以及发送到什么地址?
IP地址,掩码,网关分别的作用?
IP地址包含两部分,一是“网络号”,二是“主机号”。 “网络号”用来定位区域,也就是我们常说的“局域网”,“主机号”用来定位区域。定位局域网内的主机,如何区分一段IP地址中哪些代表“网络”,哪些代表“主机”?这和我们的面膜有关系。当我们讲算法的时候就知道了。 IP 地址它是一个点分字节。点分字节是一个十进制数,可以用两个点之间的字节来表示。 1个字节由8个二进制数字组成。这8个二进制数字是从全0到全1的演变过程,它能表示的十进制数范围是0到255,那么我们看一下掩码‘255.255.255.0’的特征,字节‘255’是all 1,"字节0"全为0。我们的IP地址"192.168.0.100"的每一个点分字节也代表了0和1的某种二进制组合。那么掩码和ip所做的就是将IP地址与掩码进行二进制“按位与运算”后,得到一个将获得数量。切割之后就会生成网络号和主机号,这就是我们的IP地址。
那么网关扮演什么角色呢?互联网上有很多台计算机,因此每台计算机都需要一个网关作为连接另一台计算机的桥梁。有一种机制叫做“下一跳”机制,英文原文叫做“Nxet dump”。我们在本地电脑上访问www.huangcuigang.cn网站。在进行IP寻址时,我们通过网关发现网站的IP地址不是同一网关内的设备。 “下一跳”前往网关。上层网关,比如路由器,发现该路由器的网关寻址不是同一路由器下的设备,然后“下一跳”到路由器服务商的网关,直到找到为止,所以称为“下一跳” " 机制
让我们看一些有趣的事情。使用route -n命令查看机器的表。有des 描述、网关和Genmask 掩码。这里有三种配置。当我们ping www.huangcuigang.cn 时,网络会将IP 地址从DNS 解析回47.111.242.7。该IP可以匹配路由表中的哪些数据掩码?我们不会使用二进制按位AND算法,只看des描述字段。可以和Who matches匹配吗?显然,169.254.0.0和172.16.48.0都无法匹配。所有IP 地址都使用掩码0 进行二进制按位与运算,均为0,因此可以匹配第一条路由配置,则得到下一跳网关地址为172.16.63.253。 pingwww.huangcuigang.cn网络请求的数据包发送到下一跳网关地址172.16.63.253进行处理。
TCP/IP协议网络层总结:
网络层的主要工作是完成下一跳机制。当访问局域网的IP地址时,可以根据子网掩码来匹配路由规则。网关地址为0.0.0.0,表示不需要下一跳网关。只要在本机的局域网中寻找主机即可。如果访问的IP地址是外网地址,那么根据路由配置,只能使用子网掩码0.0.0.0进行二进制按位与运算然后进行匹配,得到下一个跳转网关地址。数据包交给下一跳网关,进入链路层的工作,完成数据包在各个网关之间的跳转并正确到达正确的主机。
5. TCP/IP协议的链路层
链接层的链接字比较有趣,因为它一次链接一个节点,所以如果这一点不行可以跳到下一点。每层都有一个协议,链路层有一个ARP协议。这很简单。简单来说,我们通过ARP协议广播要访问的IP地址。局域网内具有相同IP地址的主机收到广播后回复该消息,然后找到相应的主机。比如我们当前主机去访问www.huangcuigang.cn,请求的数据包接下来会跳转到网关100.xxx.xxx.100。网关100.xxx.xxx.100根据IP地址子网掩码仍然匹配。如果无法匹配,则继续发送数据包。下一跳是到下一个网关101.xxx.xxx.100。根据IP地址和子网掩码可以匹配到,说明该IP地址找到了对应的局域网。我们根据ARP协议再广播一个www.huangcuigang.cn。局域网内的IP地址101.xxx.xxx.200、101.xxx.xxx.200收到消息后会立即回复消息,正确找到www.huangcuigang.cn的主机。
【深入解析:现代网络通信协议技术与应用】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
一直觉得网络世界就是一群人的“代码语言”。
有14位网友表示赞同!
学习协议感觉有点像解开神秘密码一样,很有挑战性。
有6位网友表示赞同!
哪个协议是现在最常用的呢?大家都在用吗?
有20位网友表示赞同!
我最近在学习TCP/IP,觉得挺重要的,要深入了解网络运作机制。
有12位网友表示赞同!
网络通讯协议太专业了,我这种菜鸟完全看不懂。
有13位网友表示赞同!
这篇文章能教会我如何设计一个自己的协议吗?
有10位网友表示赞同!
想在互联网上做啥,就要打好协议的基础,懂了吗?!
有18位网友表示赞同!
其实协议很抽象,不过它的背后是一些关键的技术实现。
有14位网友表示赞同!
学习网络通讯协议真像学一门新的语言一样!
有14位网友表示赞同!
以后用网络的时候,再也不用觉得它是那么神秘了,嘿嘿!
有19位网友表示赞同!
Protocols 有什么应用场景呢?
有6位网友表示赞同!
协议设计好坏会直接影响网络的效率和稳定性吧。
有17位网友表示赞同!
感觉这个话题挺重要的,毕竟是连接世界的重要桥梁啊!
有14位网友表示赞同!
学习了这些协议,对今后从事网络相关工作的帮助很大吧?
有16位网友表示赞同!
有没有什么简单易懂的解释网络通讯协议的内容呢?
有15位网友表示赞同!
以后要多关注网络的发展趋势,掌握最新的协议技术。
有14位网友表示赞同!
我感觉这个领域会越来越热门,需要提前学习这些知识。
有14位网友表示赞同!
这篇文章写的蛮深入的,值得仔细研读。
有5位网友表示赞同!
了解网络通讯协议,能更好地理解我们今天网上的任何事。
有13位网友表示赞同!