一、传输层#
TCP#
1 TCP三次握手#
- 第一次握手:客户端发送带有SYN的数据到服务端,客户端进入SYN_SEND状态。如果成功的话,此时服务端确认客户端发送正常,自己接收正常。
- 第二次握手:服务端发送带有SYN和ACK的数据到客户端,服务端进入SYN_RECV状态。如果成功的话,此时客户端确认自己发送接收正常,服务端发送接收正常。
- 第三次握手:客户端发送带有ACK的数据到服务端,客户端和服务端都进入ESTABLISHED状态。如果成功的话,此时服务端确认自己的发送正常,客户端接收正常。
第2次握手传回了ACK,为什么还要传回SYN?
- SYN是同步序列编号,是 TCP/IP 建立连接时使用的握手信号。
- SYN是为了建立并确认从服务端到客户端的通信。ACK只是告知已正确接收到数据。
2 TCP四次挥手#
- 第一次挥手:客户端发送一个FIN的数据到服务端,同时关闭客户端到服务端的发送。客户端进入FIN-WAIT-1状态。客户端告诉服务端,自己没什么要发送的了。
- 第二次挥手:服务端收到后,发送一个ACK到客户端。服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。服务端告诉客户端,自己知道你没什么要发送的了。但此时客户端不知道服务端是否已经把需要发送的都发送完毕。
- 第三次挥手:当服务端将需要发送的发送完毕之后,服务端发送一个FIN到客户端,服务端进入LAST-ACK状态。服务端告诉客户端,自己也没什么要发送的了。
- 第四次挥手:客户端发送ACK,进入TIME-WAIT状态。服务端接收到之后,进入CLOSE状态。客户端在等待2MSL(报文段最长寿命)没收到回复后,认为服务端已正常关闭,客户端关闭连接。
如果第二次挥手时服务器的ACK没有送达客户端。
- 如果客户端没有收到ACK确认,会重新发送FIN请求。
为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态。
- 如果服务端因为某些原因而没有收到ACK的话,服务端就会重发FIN,如果客户端在 2倍MSL 的时间内又收到了 FIN,客户端会重新发送ACK并再次等待 2MSL,防止服务端因为没有收到 ACK 而不断重发 FIN。
- MSL是一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。
3 TCP如何保证传输的可靠性#
- 基于数据块进行传输
- 对失序数据包重新排序以及去重
- 校验和
- 超时重传
- 流量控制
- 拥塞控制
4 TCP如何实现流量控制#
javaguide.cn/cs-basics/n…
TCP利用滑动窗口实现流量控制。流量控制是通过控制发送方发送速率,保证接收方来得及接收。
5 TCP 的拥塞控制是怎么实现的#
- 慢开始
- 初始化拥塞窗口cwnd为1。
- 每当收到一个ACK,cwnd大小加一。
- 每当过了一个往返延迟时间RTT。cwnd大小直接翻倍,乘2,以指数让升。
- 拥塞避免算法
- 当cwnd的值到了慢启动阈值时,每当过了一个往返延迟时间RTT,cwnd大小加一。
- 可以将cwnd缓慢的增加,调整到网络的最佳值。
- 快速重传
- 当发送端接收到3个以上的重复ACK,认为网络拥塞发生,触发快速重传和快速恢复。
- 发送端会快速重传丢失的数据包,无需等待定时器超时。
- 快速恢复
- 当拥塞发生时,也会立即触发快速恢复。
- cwnd和慢启动阈值都设置为当前cwnd的一半,立即进入拥塞避免算法,可以避免慢启动过程。
为什么需要拥塞控制
- 在网络出现拥堵时,如果继续发送大量的数据包,可能会导致数据包、时延、丢失,这时 TCP 就会重传数据,但是⼀重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包。
6 TCP包乱序、丢包怎么办#
- TCP通过SEQ和ACK的值保证顺序。
- 如果接收端收到乱序包,接收端会缓存下来,然后立即发送,上一个ACK,不必让发送方等到超时重传,而是立即重传。
- 接收到重发的之后,直接发送按顺序的最大一个的ACK,缓存的数据不需要重发。
7 粘包和拆包#
- 什么是
- 粘包:两个或者多个以上的包粘在一起
- 拆包:解决粘包问题
- 为什么会出现
- 发送方发送不及时,多个包在发送端粘在一起
- 接收方接收不及时,包在接收端堆叠
- 怎么解决
- 带包头就可以解决,包头定长,以特定标志开头,带着负载长度。
UDP#
1 TCP和UDP的区别#
- TCP需要连接,UDP不需要连接。
- TCP提供可靠的传输服务。
- TCP有状态,记录自己发送消息的状态,比如消息是否发送了、是否被接收了等。UDP无状态。
- TCP效率比UDP低,因为多了建立连接,确认,重传等机制。
- TCP首部开销比UDP大
- TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多
二、应用层#
HTTP#
1 post和get区别#
- get用于获取信息,是幂等的,且可缓存
- post用于修改服务器上的数据,非幂等,不可缓存
- GET把参数包含在URL中,POST通过request body传递参数
- GET请求在URL中传送的参数是有长度限制
- post比get安全
2 http和https#
- http用明文进行数据传输,https用ssl协议对数据进行加密。HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
- http用80端口,https用443端口。
- https协议需要到ca申请证书。
SSL/TLS 的核心要素是非对称加密。非对称加密采用两个密钥——一个公钥,一个私钥。在通信时,私钥仅由解密者保存,公钥由任何一个想与解密者通信的发送者(加密者)所知。
3 HTTP 各个版本的区别#
1.0
- 新增了POST,可以传输多媒体资源
1.1
- 新增长连接,支持断点传输
2.0
- 多路复用,支持服务器推送
DNS#
DNS作用
- DNS是一个数据库,域名解析指的是通过主机名获得IP地址
DNS是应用层协议,传输层使用的是UDP。
DNS的解析流程
- 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存
三、其他#
1 浏览器从输入网址URL到页面展示的过程#
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
2 URL和URI的区别#
- URI是统一资源标志符,可以唯一标识一个资源。
- URL是统一资源定位符,可以提供该资源的路径。URL是一种特殊的URI,不仅标识了一个唯一的资源,还提供了找到它的路径
3 短连接和长连接的区别#
- 连接方式不同:短连接每次请求响应建立一次连接,完成数据传输后断开连接,长连接建立连接后保持连接状态,多次传输共用同一个连接
- 传输效率不同:短连接频繁建立断开连接,产生额外的开销。长连接效率高
- 应用场景不同:短连接适合频率低、请求响应小的场景,例如http请求、RPC调用。长连接适用TCP连接、WebSocker等。
4 七层模型#
- 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
- TCP和UDP是传输层
- IP是网络层
- ARP是数据链路层
5 time wait过多怎么办#
- 修改time wait连接状态上限值
- 启动快速回收机制
- 开启复用机制
- 修改短连接为长连接方式
- 由客户端主动断开连接