一个网页的打开大致分为以下几步:
1.DNS查询
在进行网络访问过程中, 实际上所访问的是IP地址. 但输入的却仅仅是域名. 因为IP地址过于复杂不利于记忆. 因此, 需要将IP转换成更具有辨识度的域名. 通过输入域名, 以DNS进行转换为IP, 再发起请求.
DNS在得到域名后会进行查询, 如果在本机中存在DNS缓存, 则会直接使用缓存显示于页面. 但是若没有, 就会进行DNS解析, 向上一级的DNS服务器发起请求, 直到本地获取到对应的IP并缓存至本地.
2.建立连接
当获取到正确的域名后, 就会对该域名发起建立连接的请求, TCP建立连接最常见的便是三次握手.
这里有一个经典的问题, 为什么是三次而非两次或者四次. 这里以连麦举例.
假设甲乙二人连麦, 甲问:你听得见吗? 此为第一次握手
已回:我听得见, 你听的见吗? 此为第二次握手
甲回:我听得见. 此为第三次握手. 至此双方确认对方能听见, 连接建立
TCP的建立其实也是如此的过程, 之所以是三次, 是因为第二次将得到的回应和询问对方是否能收到回应给一起发送了过去. 因此是三次而非四次.
3.发送请求
连接建立以后, 作为客户端这一方就会发起请求. 这里以百度为例. 客户端会发起一个打开百度搜索的请求. 这个请求常见的以GET和POST居多. 但就自身而言, 更倾向于使用POST. POST与GET相比更为安全, 因为不会将传递参数显示在URL上. 但二者本质区别是GET是从服务器上获取数据, 而POST是向服务器内传递数据.
4. 返回响应
收到客户端发来的请求后, 服务器会根据请求返回数据. 这里返回的数据大都是前端的数据, 最后加载展示到前端页面上. 这样一次请求就结束了.
5.断开连接
断开连接, 可以形象的称为四次挥手. 这里也可以画图说明问题:
这里大致的过程是客户端发起一个FIN断开连接的请求, 然后服务器回应, 确认断开. 稍后再以同样的方式, 以服务器再发一次, 这样双方就断开了连接.
但是这里也存在一个问题, 为什么不能向三次握手那样将第二个ACK和第三个FIN一起发送从而变为三次挥手呢? 原因在于FIN的发送不是由内核控制的 ,而是由应用程序执行到相关的close方法才会触发. 但是ACK是由内核控制, 一旦收到FIN就会发送ACK. 但是对服务器而言, 要发送FIN也得执行到服务器相关的close方法才行. 因此, 服务器的ACK和FIN不一定同时执行. 所以二者不能像三次挥手那样融合在一起.
当连接断开以后, 整个过程也就差不多结束了.
------------------------------最后编辑于2023.9.17 下午6点左右