浏览器打开https://www.baidu.com/流程

这是一道烂大街的面试题,不过通过这个问题我们可以将网络整个通信过程捋清楚,在这个过程中将计算机网络的各个部分串联起来。

概述

  1. 对https://www.baidu.com/这个网站进行域名解析,得到对应的IP地址
  2. 根据这个IP,找到对应的服务器,发起TCP的三次握手
  3. 建立TCP连接后发起HTTP请求
  4. 服务器响应HTTP请求,浏览器得到html代码
  5. 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)(先得到html代码,才能去找这些资源)
  6. 浏览器对页面进行渲染呈现给用户
  7. 服务器关闭关闭TCP连接【1】

下面对每个部分做详细的说明

应用层

HTTP请求

https://www.baidu.com/从url最一开始中可以看出是http协议(暂时不管https),当然浏览器也可以使用ftp协议,mailto协议。完整的url:协议://域名(ip):端口号/文件路径,浏览器需要做的就是解析这个url,以确定我需要的资源在哪个主机的哪个文件目录下。

解析完后浏览器通过http协议来访问web服务器,对“什么”(url)进行“怎样的操作”(get、post...),当然如果是post请求的话,就需要在request body内包含相应的信息。

http消息中包含:

  1. 请求行:“什么”,“怎样的操作”
  2. 请求头
  3. 请求体

浏览器根据解析到的信息以及http请求定义的内容来生成http请求消息,并发送到web服务器,web服务器在返回相应的response

DNS

子网(集线器相连) --> 路由器 --> ... --> 路由器 --> 目标子网(TCP/IP结构)
TCP/IP网络中都是使用IP地址来确定通信的对象的,而我们平时在使用的时候都是用的域名,这就需要某一个机制能通过域名得到对应的ip地址(域名:给人看好记,ip:给网络设备看的,使用域名的话太长了)。而DNS服务器就提供了这样的功能

浏览器调用Socket库的gethostbyname,发送给DNS服务器(也需要DNS服务器的ip,不过我们都已经设置过了)来查询ip,当然Socket库没有发消息的能力,需要依赖os的协议栈

  1. 先给最近的DNS服务器发请求(设置的?)
  2. 跟域
  3. com
  4. baidu
  5. www

委托OS的协议栈

Socket库所做的事情:(以发送给DNS服务器获取ip为例)

  1. gethostbyname 获取ip
  2. socket 获取文件描述符,用于区分不同的socket,更上一层可以认为是请求
  3. connect(fd, ip, port)
  4. write
  5. read
  6. close

协议栈和网卡


再详细看一下整个传输过程中三次握手和四次挥手的部分:

三次握手

我们知道TCP是一个可靠的传输协议,那么它需要解决了哪些可能的问题?

  1. 解决丢包
  2. 解决重复
  3. 解决失序
  4. 解决出错

TCP是如何解决的?

  1. 丢包:超时重传机制,即我发送一个数据包给server,但是在一定的时间内没有收到ack的话,就认为包丢了需要重新发。当然这个一定时间是需要动态计算的,待详看。
  2. 重复:由于有超时重传的机制,所以server端很有可能收到两个相同的包








说明

===================================

仅作为校招时的《个人笔记》,详细内容请看【参考】部分

===================================

参考

  1. https://cloud.tencent.com/developer/article/1500463
  2. 《网络是怎样连接的》强烈推荐
posted @ 2023-08-11 11:19  optimjie  阅读(9273)  评论(0)    收藏  举报