面试遇到的问题(三)

介绍一下一次网络请求的过程

参考:
一次完整的Http请求过程
TCP 三次握手
HTTP 协议

简单理解:

  1. 域名解析
  2. 发起TCP 三次握手
  3. 建立TCP/IP 连接后发起HTTP 请求
  4. 服务器响应HTTP 请求,浏览器获取HTMl代码
  5. 浏览器解析HTML代码,获取静态资源(js,css,图片)
  6. 浏览器对页面进行渲染,并呈现给用户

域名解析

浏览器查询DNS,获取域名对应的ip地址,具体过程包括:

  • 浏览器搜索自身的DNS缓存
  • 搜索操作系统的DNS缓存
  • 读取本地HOST 文件
  • 向本地DNS服务器进行查询

对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析;如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP 地址映射,完成域名解析;如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询。

TCP的三次握手连接建立

拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序(本文就以Nginx为例),最终建立了TCP/IP的连接。

三次握手过程
三次握手

TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。

两个序号和三个标志位:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。

  1. 第一次消息发送中,客户端随机选取一个序列号作为自己的初始序列号发送给服务端
  2. 第二次消息发送中,服务端使用ack 对客户端的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;
  3. 第三次消息发送中,客户端告诉客户端收到确认消息并准备建立连接,客户端自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

你可能感兴趣的:(面试遇到的问题(三))