一个请求进来到底经历了多少?

一、请求过程

(1)域名解析:解析出ip地址,先本地host文件中找,找不到去本地DNS中找,还找不到去域服务器中找,找到后保存在本地DNS中
(2)封装:浏览器向对应ip的服务器发起请求,请求经历以下四层封装
(3)字符转字节
(4)分用:自下向上分层解析,校验数据完整性
(5)渲染,展示:浏览器解析html
一个请求进来到底经历了多少?_第1张图片

二、 HTTP协议——应用层

报文格式一般包含:起始行+首部+实体
(1)起始行分和响应起始行(协议版本+状态码+描述文本)

# 请求起始行(方法+请求URL+协议版本)
GET /health HTTP/1.1
# 请求起始行(方法+请求URL+协议版本)
HTTP/1.1 200 OK

(2)首部又分请求首部、响应首部、通用首部、实体首部和扩展首部

HTTP/1.0 200 OK
Server: xxxxxxx
Date: Sun,17 Sep 2019 02:01:16 GMT
--------------------------------实体首部
Content-Type: text/plain
Content-length: 18
--------------------------------实体主体
Hi! I'm a message!
--------------------------------

(3)实体中有HTTP1.1下特定的实体首部

  • Content-Type: 实体主体中的数据类型。
  • Content-Length: 实体主体的长度或者大小。
  • Content-Language: 和传输的数据最匹配的语言。
  • Content-Encoding: 来标识服务端编码时所用的编码方式。
  • Content-Location: 要返回的数据的地址。
  • Content-Range: 如果是部分实体,用来标记它是实体的哪个部分。
  • Content-MD5: 实体主体内容的校验和。
  • Last-Modified: 所传输内容在服务器上创建或者最后修改的日期时间。
  • Expires: 实体数据试下的日期时间。
  • Allow: 所请求资源允许的请求方法。
  • ETag: 资源的特定版本的标识符。可以让缓存更高效,并节省带宽。
  • Cache-Control: 控制缓存机制的指令。

三、 TCP——传输层

当要传输一个HTTP报文时,报文数据会以流的形式通过一条已经打开的TCP连接按顺序传输,TCP将收到的数据分成小块,每块是一个TCP分组
由于数据是分成小块的,要保证数据的有序完整,通过确认应答,序列号,校验和来判断,再通过重发控制和窗口机制来校准。

  • TCP是传输控制协议,传输控制主要依赖首部包含的6个标志:
  • URG 紧急指针
  • ACK 确认序号有效
  • PSH 接收方应该尽快将这个报文段交给应用层
  • RST 重建连接
  • SYN 同步序号用来发起一个连接
  • FIN 发端完成发送任务

一个请求进来到底经历了多少?_第2张图片

源端口和目的端口:标识发送方和接收方的端口号
TCP段序号:每段报文中的数据的每个字节都有序号,第一个字节的序号从0开始,依次加1,加到2的32次方减1后再次从0开始
首部长度:TCP首部的字节长度
TCP段确认序号:当首部标志ACK为1时,确认序号有效,TCP段被接收端接收后,会回送发送端一个确认号,为上次接受的最后一个字节序号加1
检验和:由发送端计算,接收端验证,如果接收方检测到检验和不正确,表明该TCP段可能有损坏,会被丢弃,同时接收端回送一个重复的确认号,表明接收到的TCP段是错误的,并告知自己希望收到的序号。这时发送端需要立即重传出错的TCP段。
紧急指针:当首部标志位URG为1时,表示紧急指针有效,它是一个正偏移量,和TCP段序号相加。由接收方决定如何处理。
窗口尺寸:决定了TCP一次成块数据流的吞吐量。需要注意的是,它表示发送方允许对方发送的数据量。
首部标志PSH:如果接收方收到PSH为1的标志,需要立即将数据提交给接收进程,不用再等待有没有其他数据进来,这里的数据是和PSH一起传送的数据以及之前接收到的全部数据。
复位标志RST:当RST为1时,表示连接出现了异常情况,接收方将终止连接,通知应用层重新建立连接。
同步序号SYN:用来建立连接。涉及到TCP的三次握手:

1.开始建立连接时,客户端向服务器发送一个TCP分组,分组首部的SYN为1,并携带一个初始序号,表明这是一个连接请求。

2.如果服务器接受了连接,会向客户端发送一个TCP分组,分组会包含SYN和ACK,都为1,同时包含一个确认序号,值为来自客户端的初始序号+1,表示连接已经接受

3.客户端收到上一步发来的分组后,会再向服务器发送一段确认报文分组,ACK为1,会再次携带确认序号,值是来自服务器确认序号+1。服务端收到确认信息后,进入连接状态。

在第三步的确认分组中,是可以携带要发送的数据的。

连接终止FIN:用来关闭连接。

1.如果客户端应用层的数据发送完毕,会导致客户端的TCP报文发送一个FIN,告知服务器准备关闭数据传送。

2.服务器接收到这个标志后,它发回一个ACK,确认序号为收到的序号加1,同时TCP还要向应用程序发一个文件结束符

3.此时服务器关闭这个方向的连接,导致它的TCP也会发送一个FIN。

4.客户端接收到之后发回一个确认ACK,序号为收到的序号 + 1,连接完全关闭。

TCP段序号与确认序号保证了数据的顺序,检验和确保数据的完整性,紧急指针保证紧急数据可被及时处理。另外,TCP还有一些超时重传、拥塞避免、慢启动的机制,都可以保证分组数据按照顺序完整的传到目标端。

四、IP——网络层

如果说TCP分组是包装货物的集装箱,那么IP就是运送集装箱的卡车。IP协议提供了两个节点之间的连接,保证将TCP数据尽可能快的从源端送到终端,但不能保证数据的可靠性。
IP层会将上层传过来的TCP分组封装,带上自己的首部,再进行选路、是否分片以及重组的工作,最终到达目的地。
一个请求进来到底经历了多少?_第3张图片

版本:分别是IPV4和IPV6,当发送和接收的版本不一致时,数据会被丢弃
首部长度:整个首部的长度,最长为60字节
服务类型(TOS):用来区分服务类型,共有5bit,11110分别对应最小时延,最大吞吐量,最高可靠性、最小费用和未用位
总长度:表示当前的数据报报文的总长度,单位为字节,可以结合首部长度计算出报文内数据的大小以及起始位置。

下面三个字段涉及IP数据报的分片和重组,IP数据报在选路时会同时查询当前设备网络层的每个数据帧的最大传输长度,一旦超出,数据报就会被分片,到达目的地再进行重组。
分组标识:这个标识相当于ID,每成功发送一个分片,IP层就会把这个分组ID加1
标志:共占用三位,R目前没有使用;D代表无需分片,一次传输成功;M代表分片,1后面还有数据,0这是最后一个分片
片偏移:标识了当前分片距离原始数据报开始处的位置,分片后,每一片的总长度会改成这一片的长度值,而不是整个数据报的长度。
生存时间(TTL):可以决定数据报是否被丢弃。每经过一层路由,值减去1,当值为0是数据被丢弃,同时发送一个带有错误消息的报文(ICMP,IP层的组成部分,用来传递一些错误信息)给源端。
首部校验和:校验数据报的完整性,发送端对首部求和,接收端接收校验,若不符合则数据报丢弃。

上层协议:决定接收端在分用的时候数据交给哪个上层协议处理,如TCP或UDP。
源IP:记录发送端的IP,在回送错误消息时用到。
目的IP:表示目的IP,每次选路都要以它做决策

4.1 路由选择

IP层会根据目的IP在本机路由表中的查询结果做出选路决策,数据报会逐跳地被运送到目的地,每一跳就是一次路由选择。其中IP层即可配置成路由器,也可以配置成主机。

每收到一个数据报时候,IP层就会根据目的IP在路由表里查询,根据查询状态会导向三种结果:

  1. 找到了与目的IP完全匹配的路由项,将报文发给该路由项的下一站路由(Gateway)或者网络接口(Interface)
  2. 找到了与目的IP的网络号匹配的路由项,将报文发给该路由项的下一站路由(Gateway)或者网络接口(Interface)
  3. 前两者都没有找到,就看路由表里有没有默认路由项(default),有的话发给它指定的下一站路由(Gateway)

要是上边三个都没有结果,那么数据报就不能被发送。IP数据报就是这样一跳一跳地被送往目的主机的,但数据报有固有的长度,一旦超出了目的主机的MTU,就会被分片。

五、ARP地址解析协议——链路层

在这里插入图片描述

ARP协议实现了从IP地址到MAC地址的映射。

  • 以太网目的地址:目的端的MAC地址,当ARP缓存表中没有的时候,这里为广播地址。
  • 以太网源地址:发送端的MAC地址
  • 帧类型:不同的帧类型有不同的格式和MTU值
  • 硬件类型:指链路层网络类型,1为以太网
  • 协议类型:要转换的地址类型
  • op操作类型:有四种,分别是ARP请求(1)、ARP应答(2),RARP请求(3)、RARP应答(4)
  • 源MAC地址:发送端MAC地址
  • 源IP地址:发送端IP地址
  • 目的以太网地址:表示目标设备的MAC物理地址
  • 目的IP地址:表示目标设备的IP地址

5.1 获取MAC地址流程

  1. 当两台设备发送报文之前,源端的链路层会用ARP协议去询问目的端的MAC地址,ARP会将一个请求广播出去,
  2. 以太网上的每一个主机都会收到这份广播,广播的目的是询问目标IP的MAC地址,内容主要是先介绍自己的IP和MAC地址,再询问如果你有目标IP,请回复你的硬件地址。
  3. 如果一个主机收到广播后看到自己有这个IP,并且请求内有源IP和MAC地址,那么就会向源主机回应一个ARP应答。如果没有目标IP,就会丢弃这个请求。可以看出请求是向外广播的,而应答是单独回应的。
  4. 在成功地接收到应答之后,IP和MAC地址的映射关系就会缓存在ARP缓存表中,有效期一般为20分钟。

5.2 IP层获取MAC地址

IP层接收到TCP分组后,发送或者封装之前,通过查询路由表:

  1. 当目标IP和自己在同一个网段时,先去ARP缓存表里找有没有目标IP对应的MAC地址,有的话交给链路层进行封装发送出去。如果缓存表内没有,进行广播,获得MAC地址后缓存起来,IP层再对TCP进行封装,然后交给链路层再封装发送出去。
  2. 当目标IP和自己不在同一个网段,需要将报文发给默认的网关。如果ARP缓存表中有网关IP对应的MAC地址,那么交给链路层进行封装发送出去。如果没有,进行广播,获得地址后缓存起来,IP层再对TCP进行封装,然后交给链路层再封装发送出去。

5.3 以太网数据帧

上面所有东西都准备好了,封装发送的其实是以太网数据帧。以太网目的地址、以太网源地址、帧类型这三者组成了帧首部。在首部之前还会插入前同步码和帧开始定界符,告知接收端做一些准备工作。帧检验序列 FCS被添加进尾部,用来检测帧是否出错。

在这里插入图片描述

前同步码: 协调终端接收适配器的时钟频率,让它与发送端频率相同。

帧开始定界符: 帧开始的标志,表示帧信息要来了,准备接收。

目的地址: 接收帧的网络适配器的MAC地址,接收端收到帧时,会首先检查目的地址与本机地址是否相符,不是的话就会丢弃。

源地址: 发送端设备的MAC地址。

类型: 决定接收到帧之后将数据交由那种协议处理。

数据: 交给上层的数据。在本文的场景中指IP数据报。

帧检验序列: 检测这一帧是否出错,发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。

你可能感兴趣的:(java基础,架构)