-
什么是协议?
作为一名程序员,你每天都在写代码,你写了那么多代码,为什么要那么写?其实从某种意义上来讲,代码也可以是一种协议,是程序员和计算机沟通的协议。
-
协议三要素
协议并不是机器能直接读懂的,需要进行翻译,翻译的过程很复杂,但它必须具备一下三点:
1,语法:符合一定的规格和格式。
2,语义:代表某种意义。
3,时序:按事件顺序进行
只有通过网络协议才能使计算机互联。
-
网络协议的模样
协议这么有用,那么到底是什么样呢?举个例子:打开浏览器输入你想浏览的网址,浏览器会显示出来,因为浏览器收到了来自HTTP协议的内容,格式如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2018 16:50:26 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
<!DOCTYPE html><!DOCTYPE html><!DOCTYPE html>
这段内容是符合三要素的,语法:只有这种格式浏览器才会识别;语义:200代表请求结果成功;时序:只有输入地址,点击发送浏览器请求后才会相应出上面的内容。
-
常用网络协议们
当在浏览器中输入URL“www.baidu.com”的时候,浏览器并不知道这个地址在哪,但是有地址薄,可以去地址薄中查找,简单的地址薄如DNS,还有更精准的地址薄查找协议HTTPDNS协议。通过查找最终会找到一串数字,叫做IP地址。这是互联网世界的门牌号,浏览器知道了这个目标地址,就开始打包请求,一般的请求都是HTTP请求,但是对于比较私密的请求,一般还会使用HTTPS协议,对于两种协议只是请求的方式有所不同,但是目的都是一样的。
DNS:(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明
HTTP,HTTPS,DNS,FTP等所在层为应用层,经过应用层的封装,浏览器会把应用层的包给下一层传输层,通过网络编程,如socker编程实现,传输层常用的两种协议是TCP,UDP协议,TCP是面向连接的,面向连接的意思就是,能够保证将应用层交给的包传输完成,如果一次不能完成,会多次连接发送,而UDP不是面向连接的,所以UDP会丢失包内容。TCP中有两个端口,一个是浏览器监听的端口,一个是所请求服务器监听的端口,操作系统会通过端口号来将请求交给属于的进程处理。
TCP/UDP的区别:
通过传输层的封装,浏览器会将包交给网络层,网络层的协议是IP协议,IP协议中有源ip,就是浏览器所在机器ip,和目标ip,即请求服务器的ip地。
操作系统知道了目标地址ip,就会去寻找这个地址,操作系统首先会判断这个地址在本地还是在,远程,如果不再本地就会去远程去寻找。如果要去远程寻找,就要去网关,操作系统启动的时候就会被DHCP配置IP地址,以及默认的网关的IP地址192.168.1.1。操作系统需要将IP地址发送给网关,就要去寻找网关,需要谁通知网关,这时就有了ARP协议,由ARP协议通知网关192.168.1.1这个本地地址在哪,这个本地地址就是MAC地址。
ARP:地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;
IP协议:IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
此时,操作系统会将IP包交给物理层,网卡将包发出去,这个包里有MAC地址,所以能够到达网关。
网关就是收到包之后,会判断下一步怎么走,网关往往是一个路由器,到达某个ip后怎么走,叫路由表,通过计算,会走向下一个网关。每个网关都可以通过本地地址MAC进行通信,一旦通过一个路由器,就会拿出ip头,里面是源ip和目标ip,并且询问下一步该怎么走?
路由器是知道这些知识的,因路由器和附近的路由器经常进行沟通,这种沟通的协议叫做路由协议,常用的有OSPF和BGP。
当到达最后一个路由器之后,这个路由器知道了要去的地方,ARP协议通过IP地址找到MAC地址,通过这个MAC地址找到目标服务器。
目标服务器通过核对MAC地址,如果没有错,取下MAC头来,发送给操作系统的网络层,核对IP,IP核对成功之后,再取下IP头,IP头里会是上一层封装的TCP协议,然后交给传输层,即TCP层。
在这一层里对于收到的每一个包都会有一个回复的包说明收到了,这个回复的包并不是请求的结果,而仅仅是TCP层的一个说明,即收到后的回复,这个回复会沿着来的方向回去。说明收到了,这就是TCP协议的可靠传输性。如果没有收到到达后的回复,过一段时间后,发送端TCP层会重新发送这个包,知道收到回复,而这个重新发送并不是重新请求,只是TCP自己的重试,除非浏览器连接断了,才会由应用层重新请求。
当到达TCP层之后,TCP头中会有目标服务器监听的端口号,根据这个端口号会找到服务器的某个进程,假设一个Tomcat,将这个包发给电商网站。
网站得到HTTP请求内容之后会,会交给Tomcat处理,而tomcat并不是所有事情都自己做,处理这个请求的所有进程需要相互通知,往往通过RPC调用,即远程调用的方式来实现,远程过程调用就是当告诉管理订单的进程的时候,Tomcat不用担心中间的网络互联问题,会有RPC框架统一处理,RPC框架有很多种,有基于HTTP协议放在HTTP报文里的,有直接封装在TCP报文里的。
Tomcat发现相应的进程处理完毕后,会发送回复一个HTTP/HTTPS的包,电商网站一般使用的是HTTPS,像请求来的时候一样,到达请求端,进入浏览器显示出你的请求结果。
-
总结:
一个简单的请求会设计很多协议,像比较火的Docker,微服务都借助各种协议来完成机器之间的通信。
-
附录
这里将一些协议和层做一些概念解释:
这里我们将OSI的七层架构罗列出来,上面是TCP/IP五层(四层)。
应用层
与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。
表示层
这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。
会话层
它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。
传输层
这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
网络层
这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。
数据链路层
它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。
物理层
OSI的物理层规范是有关传输介质的特这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。
下面是五层以及对应的协议: