浏览器打开https://www.baidu.com/流程
这是一道烂大街的面试题,不过通过这个问题我们可以将网络整个通信过程捋清楚,在这个过程中将计算机网络的各个部分串联起来。
概述
- 对https://www.baidu.com/这个网站进行域名解析,得到对应的IP地址
- 根据这个IP,找到对应的服务器,发起TCP的三次握手
- 建立TCP连接后发起HTTP请求
- 服务器响应HTTP请求,浏览器得到html代码
- 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)(先得到html代码,才能去找这些资源)
- 浏览器对页面进行渲染呈现给用户
- 服务器关闭关闭TCP连接【1】
下面对每个部分做详细的说明
应用层
HTTP请求
https://www.baidu.com/从url最一开始中可以看出是http协议(暂时不管https),当然浏览器也可以使用ftp协议,mailto协议。完整的url:协议://域名(ip):端口号/文件路径,浏览器需要做的就是解析这个url,以确定我需要的资源在哪个主机的哪个文件目录下。
解析完后浏览器通过http协议来访问web服务器,对“什么”(url)进行“怎样的操作”(get、post...),当然如果是post请求的话,就需要在request body内包含相应的信息。
http消息中包含:
- 请求行:“什么”,“怎样的操作”
- 请求头
- 请求体
浏览器根据解析到的信息以及http请求定义的内容来生成http请求消息,并发送到web服务器,web服务器在返回相应的response
DNS
子网(集线器相连) --> 路由器 --> ... --> 路由器 --> 目标子网(TCP/IP结构)
TCP/IP网络中都是使用IP地址来确定通信的对象的,而我们平时在使用的时候都是用的域名,这就需要某一个机制能通过域名得到对应的ip地址(域名:给人看好记,ip:给网络设备看的,使用域名的话太长了)。而DNS服务器就提供了这样的功能
浏览器调用Socket库的gethostbyname,发送给DNS服务器(也需要DNS服务器的ip,不过我们都已经设置过了)来查询ip,当然Socket库没有发消息的能力,需要依赖os的协议栈
- 先给最近的DNS服务器发请求(设置的?)
- 跟域
- com
- baidu
- www
委托OS的协议栈
Socket库所做的事情:(以发送给DNS服务器获取ip为例)
- gethostbyname 获取ip
- socket 获取文件描述符,用于区分不同的socket,更上一层可以认为是请求
- connect(fd, ip, port)
- write
- read
- close
协议栈和网卡


再详细看一下整个传输过程中三次握手和四次挥手的部分:
三次握手
我们知道TCP是一个可靠的传输协议,那么它需要解决了哪些可能的问题?
- 解决丢包
- 解决重复
- 解决失序
- 解决出错
TCP是如何解决的?
- 丢包:超时重传机制,即我发送一个数据包给server,但是在一定的时间内没有收到ack的话,就认为包丢了需要重新发。当然这个一定时间是需要动态计算的,待详看。
- 重复:由于有超时重传的机制,所以server端很有可能收到两个相同的包
说明
===================================
仅作为校招时的《个人笔记》,详细内容请看【参考】部分
===================================
参考
- https://cloud.tencent.com/developer/article/1500463
- 《网络是怎样连接的》强烈推荐

浙公网安备 33010602011771号