链接: https://pan.baidu.com/s/1hRTh7rSesikisgRUO2GBpA?pwd=utgp 提取码: utgp
最近总结了Linux网络的内容,总结内容如下:
发过去
应用层
4.1 浏览器缓存
4.2 主机缓存
4.3 DNS域名解析
4.4 路由器解析
传输层
网络层
网卡
交换机
电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号
将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录
路由器(网卡)
检查MAC地址看看是不是给自己的
去掉MAC头部,查询路由表确定端口
发送包
看网关,如果有网关就向这个IP发
利用ARP查询MAC地址
再做一个有MAC的包
收回来
这个问题我基于TCP/IP的网络模型来回答,并且暂时不考虑浏览器缓存的情况。
首先看一下应用层:对于应用层,当用户输入一个网址后,此时会进行URL解析,根据URL构建出想要请求的资源路径,使用的协议,具体方法,请求的IP和端口信息。其中IP需要使用DNS域名解析协议来进行获取,基于这些内容,一个初步的报文就在应用层构建完毕了,此时应用层就完成了自己的任务。
现在数据包来到传输层了,Http协议基本都是遵循TCP协议的,因此我们只考虑TCP协议的情况,到达传输层后,建立TCP的三次握手,如果是HTTPS再构建四次TLS握手,最终可以进行收发数据,此时就给报文添加一个TCP的报头,然后继续向下传递
现在数据包来到网络层了,网络层根据解析出的IP地址以及自身的属性,最终构建出一个IP的报头,添加到数据包前,然后继续向下传递
此时数据包来到了网络接口层,数据包在网络中的传输依赖于路由器和交换机的协同工作。路由器根据路由表选择最佳路径,将数据包转发到下一个网络。交换机则根据MAC地址表快速转发帧到目标网络接口。如果MAC地址表中没有目标MAC地址,交换机会将帧广播到所有端口,直到找到正确的接收者
数据包在进行传输的过程中,网络中的每一个设备都可以对这个包进行接受,接受到包之后,根据MAC地址来判断是不是给自己的,如果是给自己的就留下来,收到缓冲区中,去掉这个没有用的MAC头部,然后到自己的路由表中进行查询,如果此时网关列中没有信息,那么就说明这个数据包已经传输到了指定的服务器,如果网关列中有数据,那么就根据网关中的这个IP,利用ARP协议来获取IP对应的MAC地址,然后插入到这个包前,然后继续进行发送,通过交换机到达下一个路由器,直到到达指定的服务器
到达指定的服务器后,服务器就会对于包进行层层解析,一直解析到应用层的数据,之后构建一个Http响应,再发回去即可
借助HTTP协议进行升级
101状态码 -> 协议切换
完美继承全双工
用报头+有效载荷解决粘包问题
HTTP是什么?
HTTP常见的状态码有哪些?
HTTP常见字段有哪些?
有什么区别?
是安全和幂等的吗?
HTTP/1.1 优点有哪些?
简单
跨平台
扩展
报头随意补充
下层随意变化
HTTP/1.1 缺点有哪些?
无状态
明文传输
不安全
HTTP/1.1 性能如何?
长连接
管道
HTTP缓存有哪些实现方式?
什么是强制缓存?
什么是协商缓存?
HTTP1.1 相比 HTTP/1.0 提高了什么性能?
问题
报头不压缩
冗余头部
响应对头阻塞
无请求优先级
无全双工
HTTP/2 做了什么优化?
头部压缩
二进制格式
并发传输
服务器主动推送资源
HTTP/3 做了什么优化?
解决TCP队头阻塞
无队头阻塞
更快的连接建立
连接迁移
如何避免发送HTTP请求?
如何减少HTTP请求次数?
减少重定向次数
合并请求
延迟发送
如何减少HTTP响应数据大小?
无损压缩
有损压缩
窃听风险
篡改风险
信息加密
校验机制
混合加密(不窃听)
非对称加密用于密钥交换
对称加密用于数据传输
摘要算法+数字签名
通过哈希算法可以确保内容不会被篡改
数字证书
防止又换私钥又换公钥
公钥加密,私钥解密
私钥加密,公钥解密
SSL/TLS 协议基本流程
客户端向服务器索要并验证服务器的公钥
双方协商生产「会话秘钥」
双方采用「会话秘钥」进行加密通信
TLS 握手
ClientHello
SeverHello
客户端回应
服务器的最后回应
握手协议
记录协议
数据加密过程
消息被分割和压缩
加上消息认证码MAC 值
压缩的片段和消息认证码一起进行加密
带上报头,组成报文
https本身一定是没问题的,一定是客户端本身有问题
电脑中病毒,证书被换了
HTTPS双向认证,如果服务端觉得客户端不值得信任,就不通信
TCP报头?
为什么需要TCP?工作在哪?
什么是TCP?
什么是TCP连接?
需要客户端与服务端达成上述三个信息的共识
socket
序列号
窗口大小
如何确定TCP连接?
四元组
TCP和UDP的区别和应用场景?
连接
可靠性
传输方式
服务对象
拥塞和流量控制
首部开销
分片不同
为什么TCP有首部长度而UDP没有?
为什么UDP有包长度而TCP没有?
TCP三次握手过程和状态变迁?
如何查看TCP状态?
为什么是三次,不是两次四次?
验证收发能力
历史连接
同步序列号
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
为什么初始化序列号都不一样?
为了防止历史报文被下一个相同四元组的连接接收
为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收
序列号是如何随机产生的?
TCP层为什么需要MSS?
第一次握手丢失会怎么样?
第二次握手丢失会怎么样?
第三次握手丢失会怎么样?
什么是SYN攻击?如何避免?
占满服务端的半连接队列
调大 netdev_max_backlog
增大 TCP 半连接队列
开启 tcp_syncookies
TCP四次挥手过程和状态变迁?
为什么需要四次挥手?
第一次挥手丢失了会怎么样?
第二次挥手丢失了会怎么样?
第三次挥手丢失了会怎么样?
第四次挥手丢失了会怎么样?
为什么TIME_WAIT时间是2MSL?
为什么需要TIME_WAIT?
防止历史数据
优雅的关闭
TIME_WAIT太多会怎么样?
如何优化TIME_WAIT?
如果建立连接后,客户端故障怎么办?
TCPkeepalive
如果建立连接后,服务端进程崩溃怎么办?
TCP的socket编程?
listen参数的意义?
accept是在哪一步?
客户端close后的流程?
没有accept还能连接吗?
没有listen还能连接吗?
超时重传?
数据包丢失
快速重传?
SACK是什么?
D-SACK是什么?
发送窗口?
接收窗口?
缓冲区和滑动窗口的关系?
窗口关闭?
打满了,不再收数据
问题?解决?
什么是糊涂窗口综合征?
慢启动
拥塞避免
拥塞发生
快速恢复
升级困难 改内核
队头阻塞
建立连接延迟
网络迁移
序列号
确认应答
超时重传
流量控制
拥塞控制
优化TCP连接建立
网络迁移
绕过三次握手
历史 RST 报文可能会终止后面相同四元组的连接,因为 PAWS 检查到即使 RST 是过期的,也不会丢弃
处于新连接建立可能收到旧的FIN+ACK,回RST
如果第四次挥手的 ACK 报文丢失了,有可能被动关闭连接的一方不能被正常的关闭
可靠传输
Packet Number 单调递增
配合 Stream ID 与 Offset
可以更加精确计算 RTT,没有 TCP 重传的歧义性问题;
可以支持乱序确认,因为丢包重传将当前窗口阻塞在原地,而 TCP 必须是顺序确认的,丢包时会导致窗口不滑动
队头阻塞
流量控制
window_update 帧告诉对端自己可以接收的字节数
BlockFrame 告诉对端由于流量控制被阻塞了
基于Stream和Connection的控制
拥塞控制
连接建立
网络迁移
序列号 = 上一次发送的序列号 + len
确认号 = 上一次收到的报文中的序列号 + len