持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
前情回顾
上一篇中我们说了简洁的回答,详细回答中我们针对DNS域名解析和TCP三次握手做了一个详细的解释。
我们现在来回顾一下DNS域名解析和TCP三次握手
DNS域名解析
- 首先会在本机进行解析,浏览器会按照浏览器-操作系统-hosts顺序查找是否存在对应解析过的IP地址,本机上没有就将信息传递给本地DNS服务器
- 本地DNS服务器又分为缓存服务器和递归服务器,缓存服务器里面又分为公共服务器和运营商提供的运营商服务器。80%的用户在运营商服务器可以找到缓存的IP地址,直接返回IP地址。如果这一步也没有找到
- 缓存服务器没有找到就进入递归服务器,根域名服务器会按照域名查找到对应的顶级域名服务器的IP地址返回给本地服务器,本地服务器再根据IP找到对应的顶级域名服务器,顶级域名服务器把负责这个域名的权威域名服务器的IP地址返回给本地域名服务器。本地域名服务器根据这个权威域名服务器的IP地址找到权威域名服务器,权威域名服务器将对应的主机IP返回给主机服务器。
正文
说完DNS解析我们url解析改进入下一步了,TCP三次握手
TCP三次握手
- 第一次,客户端发送一个请求给服务器请求连接。发送状态:SYN=1,序列号:seq=x
- 服务器接收客户端的请求连接,回应确认并发送确认序列号。确认报文段:ACK=1,SYN=1,初始序列号seq=y,确认序号:ack=x=1。
- 第三次,客户端接收到服务器返回的确认连接信息。确认报文段:ACK=1,SYN=1,ack=y+1
至此,TCP三次握手就算完成了。
这里面也涉及了一些其他的问题,这里也进行一个补充说明。
为什么是三次握手而不是两次
是为了防止报文段丢失或者一些其他原因导致请求延迟到达服务器,客户端重复发送请求造成的资源浪费。
详细版本:如果是两次握手,客户端发起连接请求,但是因为报文头丢失等原因造成没有接到确认信息。这个时候客户端重新发送了一次请求,成功的建立了连接,数据传输完毕之后断开连接。这个时候第一次发送的请求也到达了服务器,服务器会以为重新发送了一个新请求再一次建立连接。
不采用三次握手,只要服务端发送确认信息就建立连接,客户端如果忽略确认信息,也不发送信息,服务端就一直等待客户端发送信息,造成了资源浪费。
结束
这一篇介绍了url在浏览器解析的第三步,下一篇将介绍建立连接之后的HTTP请求中的处理。