上篇文章我们以一个访问我的博客shiyujun.cn为例子描述了如何把一个域名转化为ip这个过程,那么拿到ip之后的交互过程是什么样的呢
第一步就是客户端和服务端之间建立连接,也就是基于3次握手。这个之前的文章中也提到过了
接着就是发生http请求,一个http请求的格式是这样的(红色字体是我给出的示例):
HTTP 请求报文封装完成后,数据来到了TCP层
TCP 层发送每一个报文的时候,都需要加上自己的地址(即源地址)和它想要去的地方(即目标地址),将这两个信息放到 IP 头里面,交给 IP 层进行传输
IP 层需要查看目标地址和自己是否是在同一个局域网。如果是,就发送 ARP 协议来请求这个目标地址对应的 MAC 地址,然后将源 MAC 和目标 MAC 放入 MAC 头,发送出去即可。
如果不在同一个局域网,就需要发送到网关,发送 ARP 协议,获取网关的 MAC 地址,然后将源 MAC 和网关 MAC 放入 MAC 头,发送出去
网关收到包发现 MAC 符合,取出目标 IP 地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的 MAC 地址,将包发给下一跳路由器。
这样路由器一跳一跳终于到达目标的局域网。这个时候,最后一跳的路由器能够发现,目标地址就在自己的某一个出口的局域网上。于是,在这个局域网上发送 ARP,获得这个目标地址的 MAC 地址,将包发出去。
目标的机器发现 MAC 地址符合,就将包收起来。发现 IP 地址符合,根据 IP 头中协议项,知道自己上一层是 TCP 协议,于是解析 TCP 的头,里面有序列号,需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。
TCP 头里面还有端口号,而我们的Tomcat正在监听这个端口号。于是,目标机器自然知道是Tomcat想要这个包,于是将包发给Tomcat
忽略上方网关和路由的过程,整个请求流程如下图所示
上方我们说的比较适应HTTP1.0/HTTP1.1,而HTTP2.0则与它们有一些区别: