应用层协议:HTTP

  • 问题:访问http://www.163.com时发生了什么

准备工作

  • 浏览器将www.163.com这个域名发送给DNS服务器,让解析为IP地址。
  • HTTP基于TCP,所以要先建立TCP连接,三次握手。
  • HTTP1.1默认开启Keep-Alive,这样建立的TCP连接,可以在多次请求中复用。

请求构建

  • 请求格式应用层协议:HTTP
  • 请求行包含请求方法,如POST;地址,这里是http://www.163.com;HTTP协议版本
  • 首部就是Header,包含key-value对。
    • Accept-Charset,表示客户端可以接受的字符集。
    • Content-Type,指的是正文的格式。
    • Cache-control和If-Modified-Since都是关于缓存的,参考缓存的内容。
  • 实体就是Body。

缓存

  • 高并发场景下的系统,在真正的业务逻辑之前,都需要有个接入层,将这些静态资源的请求拦在最外面。
    应用层协议:HTTP
  • 对于静态资源,有 Vanish 缓存层。当缓存过期的时候,才会访问真正的 Tomcat 应用集群。
  • Header中的Cache-control用来控制缓存,当客户端发送请求包含max-age。如果判定缓存层中,资源的缓存时间数值比指定时间的数值小,那么客户端就用缓存层的资源;如果max-age值为0,缓存层通常需要将请求转发给应用集群。
  • Header中的If-Modified-Since也是一个关于缓存的。也就是说,如果服务器的资源在某个时间之后更新了,那么客户端就应该下载最新的资源,如果没有更新,服务端会返回304 Not Modified,客户端就不用下载了。

请求发送

  • HTTP协议是基于TCP的,所以它使用面向连接的方式发送请求,通过stream二进制流的方式传给对方,当然,到了TCP层,会把二进制流变成一个个的报文段发送给服务器。
  • 在发送每个报文段时,都需要对方有个回应ACK,来保证报文可靠地到达了对方,如果没有回应,那么TCP这一层会进行重传。
  • TCP发送每一个报文段,都需要加上源地址和目标地址,将这两个信息放到IP头,交给IP层进行传输。
  • IP层查看目标地址和自己是否在一个局域网,如果在一个局域网,就发送ARP协议来请求这个目标地址对应的MAC地址,然后将源MAC和目标MAC放入MAC头,发送出去即可;如果不在一个局域网,就需要发送到网关,还是发送ARP协议,来获取网关的MAC地址,然后将源MAC和网关MAC放入MAC头,发送出去。
  • 网关收到包发现MAC符合,取出目标IP地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,将包发给下一跳路由器。
  • 当到达目标局域网时,最后一跳的路由器判断目标的地址就在自己某个出口个局域网上,就在这个局域网发送ARP,获得目标地址的MAC地址,将包发送出去。
  • 目标机器收到后,拆包,解析,然后返回。

返回构建

  • HTTP的返回报文格式
    应用层协议:HTTP