1.例如当我们在 web 浏览器的地址栏中输入:www.baidu.com,具体发生了:
- 对www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
- 根据这个 IP,找到对应的服务器,发起 TCP 的三次握手
- 建立 TCP 连接后, 发起 HTTP 请求
- 服务器响应 HTTP 请求,浏览器得到 html 代码
- 浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、图片等)(先得到 html 代码,才能去找这些资源)
- 服务器响应对应的资源
- 响应数据完毕, 四次挥手,关闭 TCP 连接
- 浏览器对页面进行渲染呈现给用户
浏览器会对输入的信息进行以下判断:
- 检查输入的内容是否是一个合法的 URL 链接。
- 是,则判断输入的 URL 是否完整。如果不完整,浏览器可能会对域名进行猜测,补全前缀或者后缀。
- 否,将输入内容作为搜索条件,使用用户设置的默认搜索引擎来进行搜索。大部分浏览器会从历史记录、书签等地方开始查找我们输入的网址,并给出智能提示。
2.TCP和UDP的区别
连接方式:TCP是面向连接的协议,UDP是无连接的协议
可靠性:TCP提供可靠的传输,保证数据的完整性和顺序性,而UDP不保证数据的完整性和顺序性
速度:UDP比TCP更快,因为它不需要建立连接和维护连接状态
传输方式:TCP是基于字节流的传输方式,UDP是基于数据报的传输方式
TCP协议的工作流程如下
客户端向服务器发送连接请求(SYN)
服务器收到连接请求后,回复确认请求(SYN+ACK)
客户端收到确认请求后,回复确认请求(ACK),完成连接
数据传输完成后,客户端和服务器分别发送关闭连接请求(FIN)
对方收到关闭请求后,回复确认(ACK)
双方都收到对方的关闭请求和确认后,关闭连接
UDP协议的工作流程如下
客户端向服务器发送数据报
服务器收到数据报后,直接处理数据并回复确认
客户端收到确认后,继续发送下一个数据报
如果数据报丢失或损坏,客户端不会重传,而是直接忽略
TCP适用于可靠传输的场景,如文件传输、电子邮件传输等
UDP适用于实时性要求高、数据量小、丢失数据不会影响结果的场景,如视频直播、语音通话等
建立一个 TCP 连接需要“三次握手”,缺一不可 :
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。
三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第2次握手时,服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信
断开一个 TCP 连接则需要“四次挥手”,缺一不可 :
- 第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态。
- 第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包->客户端 。然后,此时服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。
- 第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y)标志的数据包->客户端请求关闭连接,然后,服务端进入LAST-ACK状态。
- 第四次挥手 :客户端发送 ACK (SEQ=y+1)标志的数据包->服务端并且进入TIME-WAIT状态,服务端在收到 ACK (SEQ=y+1)标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。
为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
客户端没有收到 ACK 确认,会重新发送 FIN 请求。
为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。
MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。