一、传输层
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如何保证传输的可靠性
- 基于数据块进行传输
- 对失序数据包重新排序以及去重
- 校验和(在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 粘包和拆包
- 什么是
- 粘包:两个或者多个以上的包粘在一起
- 拆包:解决粘包问题
- 为什么会出现
- 发送方发送不及时,多个包在发送端粘在一起
- 接收方接收不及时,包在接收端堆叠
- 怎么解决
- 带包头就可以解决,包头定长,以特定标志开头,带着负载长度。
7 tcp是全双工还是半双工
tcp是全双工协议,双方可以同时通信,所以发送方和接收方,各自维护一个发送窗和接收窗。
- 发送窗:用来限制发送方可以发送的数据大小,其中发送窗口的大小由接收端返回的TCP报文段中窗口字段来控制,接收方通过这个字段告知发送方自己的缓冲大小(受系统、硬件等限制)。
- 接收窗:用来标记可以接收的数据大小
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
- 多路复用,支持服务器推送
4 常见的http状态码和含义
- 1xx:正在处理
- 2xx:成功
- 3xx:重定向
- 301是永久重定向
- 302是临时重定向
- 4xx:客户端错误
- 401需要认证
- 403请求被拒绝
- 404:not found
- 5xx:服务器错误
5 HTTPS加密过程
- TLS基本都是用RSA来实现密钥交换,证书文件是公钥,保存在客户端,私钥保存在服务端,需要保证不会泄露
- RSA密钥交换的TLS握手过程会经历四次
- 第一次握手是客户端发送给服务端,携带:TLS版本、客户端生成的随机数、密码套件列表
- 第二次握手是服务端回复客户端,携带:确认的TLS版本、服务端生成的随机数、确认的密码套件列表、服务器的数字证书
- 客户端收到第二次握手的结果,会确认服务器的数字证书的真实性,从证书里取出公钥,加密报文,发送第三次握手的内容
- 第三次握手的内容包括:一个随机数,加密通信算法改变通知,客户端握手结束通知
- 第四次握手的内容包括:加密通信算法改变通知,服务器握手结束通知
- 接下来使用的是普通的HTTP协议,只不过会用【会话秘钥】加密内容
DNS
DNS作用
- DNS是一个数据库,域名解析指的是通过主机名获得IP地址
DNS是应用层协议,传输层使用的是UDP。
DNS的解析流程
- 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存
三、其他
1 浏览器从输入网址URL到页面展示的过程
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
2 URL和URI的区别
- URI是统一资源标志符,可以唯一标识一个资源。
- URL是统一资源定位符,可以提供该资源的路径。URL是一种特殊的URI,不仅标识了一个唯一的资源,还提供了找到它的路径
3 短连接和长连接的区别
- 连接方式不同:短连接每次请求响应建立一次连接,完成数据传输后断开连接,长连接建立连接后保持连接状态,多次传输共用同一个连接
- 传输效率不同:短连接频繁建立断开连接,产生额外的开销。长连接效率高
- 应用场景不同:短连接适合频率低、请求响应小的场景。长连接适用TCP连接、WebSocket等。
4 七层模型
- 物理层,数据链路层,网络层,传输层,(会话层,表示层),应用层
- ARP是数据链路层
- IP是网络层
- TCP和UDP是传输层
- 五层模型是:物理层、数据链路层、网络层、传输层、应用层
4.1 七层模型的主要功能
- 物理层:底层数据传输,比如网线、网卡标准
- 数据链路层:定义数据的基本格式,如何传输、如何标识,比如网卡mac地址,ARP
- 网络层:定义IP编址,定义路由功能,比如不同设备的数据转发,IP
- 传输层:端到端传输数据的基本功能,比如tcp和udp
- 会话层:控制应用程序之间绘画能力,比如不同软件数据分发给不同软件
- 表示层:数据格式标识,基本压缩加密功能
- 应用层:各种应用软件,包括web应用
5 time wait过多怎么办
- 修改time wait连接状态上限值
- 启动快速回收机制
- 开启复用机制
- 修改短连接为长连接方式
- 由客户端主动断开连接
6 cookies和session分别存放在哪里
cookie存放在客户端,session存放在服务端,所以session存储的数据比较安全
7 ping的底层过程
- ping是应用层使用网络层ICMP的例子。
- 客户端会构建ICMP回送请求消息数据包,包含
- 类型:8
- 序号:区分连续ping的时候发出的多个数据包
- 每发出一个请求,序号会自动加一,为了计算往返时间RTT,会在数据部分插入发送时间
- 服务端在收到请求的时候,会构建一个ICMP回送响应消息数据包,回送响应数据包的
- 类型:0
- 序号是接收到的,请求数据包的序号
8 ttl是什么
- ttl是生存时间,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,都把TTL减一,再转发。
- 如果IP包,到达目的IP之前,TTL减少到0,路由器会丢弃收到的TTL=0的IP包,然后发送ICMP报错