协议三要素:语法、语义、顺序。
先看一个浏览器访问网址的过程:
1. 在浏览器中输入http://www.kaola.com,这是一个URL,不知道其ip地址,因此通过DNS协议去寻找目的服务器的ip地址。
寻找过程:
- 首先先去访问本地域名服务器(本地DNS)。(如果是通过DHCP服务器配置,那么本地DNS由你的网络服务商自动分配,可能在运营商的某个机房里)。
- 本地DNS服务器收到请求。如果在本地缓存内查到对应网址的ip地址,那么直接返回需要的ip地址;如果未查到,则访问根域名服务器。(根服务器是最高层次的,它不用于解析域名,但是可以为寻找到对应的服务器指明道路)。
- 根DNS服务器收到来自本地DNS服务器的请求,发现后缀名是.com,告诉本地DNS去寻找.com顶级域的DNS服务器。
- 本地域名服务器转向问顶级域名服务器(顶级域名服务器负责管理二级域名),顶级域名服务器提供一个更加清晰的寻找方向(kaola.com),告诉本地域名服务器去问权威域名服务器。
- 本地DNS转向问权威DNS服务器,权威DNS服务器查询到对应的ip地址后返回给本地DNS,本地DNS再将ip地址返回给客户端。
2、知道ip地址后,打包请求,对于浏览器请求,会使用HTTP或HTTPS协议,内部注明请求的具体内容。(因为HTTP是基于TCP协议的,因此发送HTTP请求之前会先进行三次握手建立TCP连接)
HTTP请求的构建:
目前使用的HTTP协议大部分是hiHTTP1.1,而且默认是开启keep-alive,这样建立的TCP链接可以在多次请求中复用。
请求的格式如下图
同样,也可以通过网页实际查看请求的标头
对于访问网页来讲,最常用的方法就是GET,顾名思义GET就是去服务器获取一些资源。访问网页一般都是获取一个页面。
当然还有其他一些方法:POST,DELETE等。POST是主动告诉服务器一些信息,比如在一些支付场景时候,告诉服务器 ”我是谁,我要支付多少,我要买啥“。 同样DELETE顾名思义是用来删除资源的。
知道几个常用的首部字段名:accept-charset表示客户端可以接收的字符集,防止出现其他的字符集而导致乱码。
Content-Type:表示正文的格式。
Cache-control:是来控制缓存的。当客户端发送请求中出现max-age指令时,如果缓存层中缓存时间数值比指定的小,那么可以接收缓存的资源;如果max-age=0时,那么缓存层通常把资源转发给应用集群。
HTTP返回的构建:
版本同样是基于HTTP1.1的。状态码会反应请求的结果:200意味着成功,404表示服务器无法响应这个请求。
通过网页实际查看响应的标头
同样对于一些首部字段:Retry-After:表示客户端应该在多长时间以后再次尝试。
Content-Type:表示返回的是什么类型HTML还是JSON类型。
上面介绍的HTTP 1.1 在应用层以纯文本的形式进行通信。每次通信都要带完整的 HTTP 的头,而且不考虑 pipeline 模式的话,每次的过程总是像上面描述的那样一去一回。这样在实时性、并发性上都存在问题。
因此引入了HTTP 2.0版本。优点:HTTP 2.0 通过头压缩、分帧、二进制编码、多路复用等技术提升性能。具体可以参考:
3、到了传输层,TCP会将上层的请求(面向连接的stream二进制流)变成一个报文段发送给服务器,在发送每个报文段的时候,都需要对方回应一个ACK,来保证报文可靠的到达对方,如果没有回应,TCP这一层会重新传输直到到达。
具体过程可以参考这个:UDP和TCP
TCP层发送每一个报文的时候,都需要加上自己的地址(即源地址)和它想要去的地方(即目标地址),将这两个信息放到IP头里面,交给IP层进行传输。
4、IP层需要检查目的地址和自己的地址是否在同一个网段。
(1)如果是在同一网段:直接采用ARP协议通过目的IP地址获取对应的目的MAC地址,然后将获得的目的MAC地址和源地址放在MAC头发送出去。
(2)如果不在同一网段:通过ARP协议获取网关的MAC地址,发送到网关后,通过各种路由协议找到下一跳,获取下一跳的MAC地址,将包发给下一跳。一直到目标局域网,最后一跳的路由器发现目的地址属于自己的某个局域网,于是在这个局域网采用ARP协议,获取目的MAC地址,将包发送出去。
在这个过程中的几个问题:
问:如何知道目的地址和自己的地址在同一网段?
答:通过子网掩码,或者CIDR无类型域间路由。
问:直接通过目的IP地址就能找到目的端了,为什么还要通过本地的MAC地址呢?
答:IP地址是人为分配的,可变的,可以有效划分不同的网段,有效避免了MAC广播寻址带来的广播风暴。MAC地址是硬件厂商出厂时的唯一标识,可以只在局域网内通过ARP寻址精确的找到接受者。
目标的机器发现MAC地址符合,就将包收起来;发现IP地址符合,根据IP头中协议项,知道自己上一层是TCP协议,于是解析TCP的头,里面有序列号,需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。
5、TCP头里面还有端口号,HTTP的服务器正在监听这个端口号。于是,目标机器自然知道是HTTP服务器这个进程想要这个包,于是将包发给HTTP服务器。HTTP服务器的进程看到,原来这个请求是要访问一个网页,于是就把这个网页发给客户端。
6、服务器端构建HTTP响应报文,然后加上TCP头后会交给IP层,然后把刚才的发送过程反向走一遍。虽然两次不一定走相同的路径,但是逻辑过程是一样的,一直到达客户端。