一、 从输入URL到页面展示到底发生了什么?
1. 首先浏览器会查看电脑本地缓存,如果有直接返回,否则需要进行下一步的网络请求。
2. 在网络请求之前,需要先进行DNS解析,来找到请求域名的ip地址。如果是HTTPS请求,则还需要建立TLS连接。
【DNS解析过程:假设你是一个旅行者到一个陌生城市问路,首先你会先问到随便一个路人(本地浏览器缓存),再问到一个本地居民(本地host文件),还是不知道路,此时你可能会看看路标(路由器缓存),最终你还是被自己路痴属性给震惊了,请了一个导游(DNS服务器),还是不行,最终问了导游基地的人(根DNS服务器),真好奇你去了个啥地方,最终找到了请求域名的ip地址。原来是一家有名的餐馆!】
3. 建立通道:浏览器与服务器ip地址建立TCP连接。连接建立好之后,浏览器把请求头,请求行等信息,再加上和该域名相关的cookies一起发送给服务器。(配送原材料和订单信息)
4. 服务器收到请求头信息,根据请求头生成响应数据。(根据原材料和订单信息,制作出一道美味的菜,并且用盒子打包好)
5. 浏览器解析响应头,如果响应头状态码是301,302,会重定向到新地址;如果是字节流类型,会将请求提交给下载管理器;如果是HTML类型,会进行下一步渲染(查看盒子外壳附有的信息)
6. 浏览器解析HTML文件,呈现最终渲染界面(品尝美味佳肴~)
二、三次握手
第一次握手:客户端向服务器端发送SYN报文,初始化序列号ISN(seq = x),然后客户端进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器发送ACK确认客户端SYN报文(ack = x + 1),然后再发送一个SYN(seq = y),服务器端进入SYN_RECV状态。
第三次握手:客户端接收到ACK, SYN报文,ACK确认服务器端(ack = y + 1),然后客户端和服务器端都进入ESTABLISHED状态。
就像是在建立一个友谊的过程一样:
-
打招呼:
想象你和一个新朋友第一次见面。你会向他们打个招呼,说:“嗨,你好!”这就像是客户端(你)向服务器(新朋友)发送了一个“嗨,你好”的消息,告诉服务器你想和它建立连接。 -
确认招呼:
新朋友收到你的招呼后,会回复:“嗨,你好!”。这时,你知道对方愿意和你成为朋友。这就像是服务器回复一个“嗨,你好”的消息,并表示愿意和你建立连接。这时,双方都知道对方想要建立连接。 -
最后确认:
你想确认一下朋友确实愿意和你一起玩,于是你说:“好的,我们一起玩吧!”这就像是客户端发送最后一条消息,表示确认建立连接。而服务器也确认了,于是双方都知道可以开始愉快地交流了。
解释一下SYN
SYN是TCP(传输控制协议)中的一个标志位,代表同步(Synchronize)。在TCP的三次握手过程中,SYN用于建立连接的初始阶段。
具体来说,在三次握手中的第一步,客户端发送一个带有SYN标志的TCP报文给服务器。这个报文告诉服务器客户端想要建立连接,并且包含了一些初始化的序列号。这个序列号用于标识数据流的起始点。
服务器在收到带有SYN标志的TCP报文后,会回复一个带有SYN和ACK(确认)标志的报文。这个报文表明服务器同意建立连接,并且服务器也选择了自己的初始化序列号。
SYN标志的使用是为了在建立连接时进行同步,确保客户端和服务器在传输数据之前都了解对方的状态,并且序列号的初始化是同步的。这有助于防止混淆和确保可靠的数据传输。
3. 四次挥手
-
告别请求:
想象你和朋友在一起愉快玩耍,但是你觉得差不多该回家了。于是,你告诉朋友:“我要回家了,再见!”这就像是客户端发送一个FIN报文给服务器,表示希望断开连接,并且报文中有一个序列号seq=x。 -
确认告别:
你的朋友接收到你的告别后,会回应:“好的,再见!”这就像是服务器回复一个ACK报文给客户端,同时把你的序列号值+1,作为ACK报文的序列号seq=x+1。这时,服务器进入CLOSE-WAIT状态,而客户端进入FIN-WAIT-2状态。 -
朋友也要告别:
现在轮到你的朋友想回家了,他也告诉你:“我也要回家了,再见!”这就像是服务器发送一个FIN报文给客户端,报文中有一个序列号seq=y+1,然后服务器进入LAST-ACK状态。 -
最后确认告别:
你收到朋友的告别后,回应:“好的,再见!”这就像是客户端发送一个ACK报文给服务器,同时把朋友的序列号值+1作为ACK报文的序列号seq=y+2。此时客户端进入TIME-WAIT状态,而服务器在收到你的ACK报文后进入CLOSE状态。如果客户端等待2MSL(Maximum Segment Lifetime)没有收到回复,才最终关闭连接。
为什么会有四次挥手,因为TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连续释放的通知。
4. TCP与UDP
TCP(传输控制协议 Transmission Control Protocol):面向连接,可靠,基于字节流的传输层通信协议。
UDP(用户数据报协议User Datagram Protocol):为应用程序提供了一种无需建立连接就可以发送封装的IP数据包的方法。
类比一下:
TCP,可靠快递服务:
- 概念: TCP就像一种可靠的快递服务,是一种有序、向连接的服务,确保数据按照顺序安全地传送。
- 特点: 它就像你寄出的包裹,有详细记录、需要签收、传输慢但可靠,占用的资源较多。
UDP,快速直达服务:
- 概念: UDP则是一种快速直达的服务,不需事先建立连接,直接发送数据,速度快但不保证可靠性。
- 特点: 这就像你随手扔出的明信片,速度快,但可能有些信件丢失,资源消耗较少。
区别:
- 连接性: TCP像是有追踪号的包裹,而UDP则是不需要追踪号的明信片。
- 可靠性: TCP提供有序、可靠的服务,就像精细的快递服务,而UDP则不做保证,数据传递不需要给出任何确认,且不保证数据不丢失以及到达顺序,就像简单的明信片。
- 状态: TCP保留发送和接收的状态,而UDP则是无状态的,不保留记录。
- 传输形式: TCP面向字节流的,像是整体传输的包裹,而UDP面向报文的,则是一张张独立的明信片。
- 效率: TCP由于追踪号等机制,效率较低,而UDP由于简单,传输较快。
使用场景:
- TCP: 适用于对数据可靠性要求高的场景,如网页浏览、文件传输、邮件传输等,就像你寄重要文件的包裹。
- UDP: 适用于对速度要求高,能容忍少量数据丢失的场景,如视频直播、实时游戏,就像你发送一些小礼物的明信片。