互联网世界中,网络协议的重要性不言而喻。不少人都知道,网络协议中的五层模型或者七层模型,这些在操做系统中,那都是“必考题”。上学的时候,不管是死记硬背,仍是各类小抄,总得把下面这个图记下来。踏入工做,走进 web 开发“不归路”,发现仍是不能落下它。
html
HTTP 协议:web
HTTP/1.1 200 OK Date: Thu, 25 Oct 2018 01:56:12 GMT Content-Type: Content-Language: <!DOCTYPE html> <html> <head> <base href="http://blog.muzixizao.com/" /> <meta charset="utf-8"/> <title>木子与西早的博客屋 </title>
咱们来看看上面的 HTTP 协议是否符合协议的三要素。面试
首先,符合语法,也就是说,只有按照上面那个格式来,浏览器才能解析。例如,上面是状态,而后是首部,最后是内容。编程
其次,符合语义,就是要按照约定的意思来。例如,状态 200,表示网页成功返回。若是不成功,就是常见的 404。浏览器
最后,符合顺序,点击浏览器,就是发送一个 HTTP 请求,而后才有上面那串返回的东西。服务器
浏览器显然按照协议商定好的作了,才能将网页呈如今你面前。网络
咱们面试的时候常常会被问到这样一个问题:socket
在浏览器输入一个地址,而后点击回车,此时到页面加载出来,这个过程发生了什么?网站
咱们就用打开博客的过程,看看互联网世界运行过程当中,都使用了哪些网络协议。加密
当在浏览器里输入 “http://blog.muzixizao.com”,这是一个 URL,而浏览器知道它的名字是 blog.muzixizao.com,可是不知道具体的地点,因此浏览器不知道如何访问。
因而,它打开地址簿去查找。在这个过程当中,咱们通常使用地址簿协议-DNS,还可使用另外一种更加精准的地址簿查找协议-HTTPDNS。
不管使用哪种方法查找,最终均可以获得这个地址:47.106.81.116。这个是 IP 地址,能够把它当作是互联网世界的“门牌号”。
知道了目标地址,浏览器就开始打包它的请求。对于普通的 HTTP 请求,通常会使用 HTTP 协议,可是若是对于购物的请求,每每会进行加密传输,于是会使用 HTTPS 协议。不管是什么协议,里面都会写明“我要看哪篇博文”。
DNS、HTTP、HTTPS 所在的层咱们成为应用层。通过应用层封装后,浏览器会将应用层的包交给下一层去完成,经过 socket 编程来实现。下一层是传输层。传输层有两种协议,一种是无链接的协议 UDP,一种是面向链接的协议 TCP。而所谓的面向链接就是,TCP 会保证这个包可以到达目的地,若是不能到达,就会从新发送,直至到达。
TCP 协议里面会有两个端口。一个是浏览器监听的端口,一个是博客服务器监听的端口。操做系统每每经过端口来判断,它获得的包应该给哪一个 进程。
传输层封装完毕后,浏览器会将包交给操做系统的网络层。网络层的协议是 IP 协议。在 IP 协议里面会有源 IP 地址和目标 IP 地址,也就是浏览器所在机器的 IP 地址和博客网站所在服务器的 IP 地址。
操做系统既然知道了目标 IP 地址,下一步就是根据这个 IP 找到目标机器。它首先会判断,这个目标 IP 是本地人仍是外地人。从 IP 很明显就能看出来,博客服务器不在本地。
操做系统知道了,要到目标机器,就要要离开本地去远方。那如何去远方呢?这个时候就能够拿出国旅游做类比。咱们要去国外,就要通过海关。一样的,操做系统要去远方,也要通过网关。而操做系统启动的时候,就会被 DHCP 协议配置 IP 地址,以及默认的网关 IP 地址:192.168.1.1。
操做系统如何将 IP 地址发给网关呢?在本地通讯基本靠吼,因而操做系统大吼一声,谁是 192.168.1.1 ?网关会回答它,我就是,个人本地地址在村东头。这个本地地址就是 MAC 地址,而大吼的那一声就是 ARP 协议。
操做系统拿到了 MAC 地址,就将 IP 包交给了下一层:MAC 层。网卡再将这个包含 MAC 地址的包发出去。因为这个包里面有网关的 MAC 地址,于是它可以到达网关。
网关收到包以后,会根据本身的知识,判断下一步应该怎么走。网关每每是一个路由器,到某个 IP 地址应该怎么走,这个叫作路由表。
路由器有点像玄奘西行路过的一个个国家的城关。每一个城关链接着两个国家,每一个国家至关于一个局域网,在每一个国家内部,均可以使用本地的地址 MAC 进行通讯。
一旦跨越城关,就须要拿出 IP 头来,里面写着贫僧来自东土大唐(源 IP 地址),想去西天(目标 IP 地址)拜佛求经。路过此地,借宿一晚,明日启行。请问接下来该怎么走?
城关每每是知道这些“知识”的,由于城关和临近的城关也会常常沟通。到哪里应该怎么走,这种沟通的协议称为路由协议,经常使用的有 OSPF 和 BGP。
城关与城关之间是一个国家,当网络包知道了下一步去哪一个城关,仍是要使用国家内部的 MAC 地址,经过下一个城关的 MAC 地址,找到下一个城关,而后再问下一步的路怎么走,一直到走出最后一个城关。
最后一个城关知道这个网络包要去的地方,因而,就对着这个国家吼一声(ARP协议),谁是目标 IP ?目标服务器就会回复一个 MAC 地址。网络包过关后,经过这个 MAC 地址就能找到目标服务器。
目标服务器发现 MAC 地址对上了,取下 MAC 头来,而后发送给操做系统的网络层。网络层发现 IP 也对上了,就取下 IP 头。 IP 头里会写上一层封装的是 TCP 协议,而后将其交给传输层,即 TCP 层。
在这一层里,对于收到的每一个包,都会有一个回复的包说明收到了。这个回复的包不是此次请求的结果,而仅仅是 TCP 层的一个收到回复。这个回复会沿着刚才来的方向走回去,报个平安。
若是过一段时间,发送端的 TCP 层没有收到平安回复,就会从新发送这个包,重复上面的过程,直到收到平安到达的回复为止。这个重试不是浏览器从新进行请求,对于浏览器而言,只发送一次请求,而 TCP 层在没有收到平安回复时,不断闷头重试。除非 TCP 层出了问题,好比链接断了,才须要浏览器的应用层从新发送请求。
当网络包平安到达 TCP 层后,TCP 头中有目标端口号,经过这个端口号,能够找到博客网站的进程正在监听这个端口号,假设是 Nginx,因而就将这个包发给 Nginx,进行相关业务处理。处理完成后,将相关数据打包,而后回复给浏览器,显示出博文页。
下图就是整个HTTP 请求中可能用到的协议。后续会经过从底层到上层的顺序来一一分享。
参考: