当前位置 : 主页 > 编程语言 > 其它开发 >

键入网址到网页显示,期间发生了什么?

来源:互联网 收集:自由互联 发布时间:2022-07-19
浏览器对url进行解析(生成发送给web服务器的请求信息) 生成http请求信息 : 请求行( 请求方法字段、URL字段和HTTP协议版本 ) GET /index.html HTTP/1.1 消息头(key-value形式) User-Agent:产
 
  1. 浏览器对url进行解析(生成发送给web服务器的请求信息)

生成http请求信息

请求行( 请求方法字段、URL字段和HTTP协议版本GET /index.html HTTP/1.1

消息头(key-value形式) User-Agent:产生请求的浏览器类型、 Accept:客户端可识别的内容类型列 表。 、 Host:主机地址(就是一些http字段)

消息体:如果是get消息体为空。

扩展响应报文:响应报文(状态行、消息报头、响应正文)

状态行

消息报头

响应正文

  1. 请求DNS服务器,通过DNS解析出web服务器对应的ip地址

他会先去看有没有对这个域名的缓存(浏览器、操作系统、host文件中都可能会缓存).

没有:比如www.server.com。通过根域名服务器去找.com,然后去找顶级域 DNS 服务器.com, 然后去找权威 DNS 服务器(server.com)然后解析出对应的ip。

  1. 应用程序通过调用Socket库,来委托操作系统协议栈工作。

调用 Sockect 库提供的 socket 系统调用,创建并初始化套接字。

协议栈先将收到的数据写到缓存区,协议栈根据MTU(网络包最大长度)减去头部长度,得到单个包的长 度, 对缓冲区数据进行拆分,然后将拆分的数据逐个发送。(不足一个包到达计时器时间后协议会立即发送)

协议调用TCP模块创建TCP头部(TCP头部:源端口、目的端口、序号、确认序号、首部长度、保留、urg、 ack、psh、rst、syn、fin、窗口大小、校验和、紧急指针、选项)。

TCP模块将消息传给IP模块,并委托IP模块进行发送。

IP模块添加IP头部和以太网头部,分别存储ip地址和下一跳路由器MAC地址。

怎么确定源ip地址:根据路由表来判断哪一个网卡作为源地址ip。首先将目标地址和第一条子网掩码进 行与运算,看目的地址与路由表上的目的地址是不是一样,不是对下一条进行重复操作。如果都不能就 会匹配默认网关地址(路由器的 IP 地址)。目的地址在域名解析的时候就已经拿到了。

接收方的MAC地址如何确认:首先会去ARP缓存中查询。没有ARP 协议帮我们找到路由器的 MAC 地址。ARP 协议会在以太网中对以太网所有的设备进行广播这个ip地址,然后就会由设备 回应MAC地址。

  1. 通过网卡驱动程序操作网卡将其复制到网卡内的缓存区中,接着会在其开头加上报文段和起始帧分界符,在末尾加上用于检测错误的帧校验序列。将包转为电信号,通过网线发送出去
  2. 电信号到达网线接口,交换机进行接收。将电信号转换成数字信号。先检验包末尾FCS。没问题放入缓冲区。查询MAC地址表是否有该记录(表中有MAC地址和端口)。
    1. 有就将包发送到对应的端口。
    2. 如果没有只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包
  1. 经过交换机后会到达路由器。电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。
    1. 如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
    2. 完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。路由器会根据 IP 头部中的内容进行包的转发操作。
    3. 首先是查询路由表判断转发目标。路由匹配和前面讲的一样,和路由表的每一条子网掩码进行与运算,与目标地址进行匹配。都匹配不到会选择默认路由。然后看表中对应的网关是空还是ip地址。如果是空代表到了终点。否则还要进行路由转发。
    4. 然后根据ARP协议将查询到的ip解析成MAC地址。路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。然后修改源MAC地址和目的MAC地址,发送网络包,通过交换机到达下一个路由器。
  1. 到达目的地。
    1. 服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。
    2. 扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
    3. 扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
    4. 服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
    5. HTTP 响应报文也需要加上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。
    6. 和之气一样转发操作
    7. HTTP 响应报文后,交给浏览器去渲染页面,一份特别的数据包快递,就这样显示出来了!最后,客户端要离开了,向服务器发起了 TCP 四次挥手,至此双方的连接就断开了。
网友评论