计算机网络
优秀博文:
https://zhuanlan.zhihu.com/p/60305452?utm_source=qq
# 应用层(应用层,表示层,会话层)
# 基于(TCP)
# HTTP
# 请求头、响应头(Header)=起始行(start line)+头部字段(header)
# 起始行(start line)
# 请求方法
GET(获取资源)(1.0)
POST(传输实体主体)(1.0)
PUT(传输文件)(1.0)
HEAD(获得报文首部)(1.0)
DELETE(删除文件)(1.0)
OPTIONS(询问支持的方法)
TRACE(追踪路径)
CONNECT(要求用隧道协议连接代理)
# URL
方案或协议+主机+端口+路径+查询+片段
# HTTP版本
HTTP1.0
HTTP1.1
HTTP2.0
# 头部字段(header)
# 通用标头
Cache-Control
Connection
# 实体标头
Content-Encoding
Content-Type
Expires
# 请求标头
Authorization
User-Agent
# 响应标头
# 空行(CRLF)
# 消息正文(entity)
# 状态码
# 1XX:提示信息,表示目前是协议处理的中间状态,还需要后续操作
# 2XX:成功,报文已经收到并被正确处理
200 OK:最常见的成功状态码,表示一切正常
204 No Content:常见的成功状态码,但响应头没有 body 数据
206 Partial Content:应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源 的全部,而是其中的一部分
# 3XX:重定向,资源位置发生变动,需要客户端重新发送请求
301 Moved Permanently:表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL
302 Found:表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问
304 Not Modified:不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定 向,用于缓存控制
# 4XX:客户端错误,请求报文有误,服务器无法处理
400 Bad Request:表示客户端请求的报文有错误,但只是个笼统的错误
403 Forbidden:表示服务器禁止访问资源,并不是客户端的请求出错
404 Not Found:表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端
# 5XX:服务器错误,服务器在处理请求时内部发生了错误
500 Internal Server Error:与 400 类型,是个笼统通用的错误码
501 Not Implemented:表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思
502 Bad Gateway:服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问 后端服务器发生了错误
503 Service Unavailable:表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍 后重试”的意思
# HTTPS
# 基于(UDP)
# 传输层(报文段(segment))
负责向两台终端设备进程之间的通信提供通用的数据传输服务
# 传输控制协议 TCP(Transmisson Control Protocol)
网络包(MTU=1500)=IP头部+TCP头部+数据(MSS)
当 TCP 层发现数据超过 MSS 时,就先会进行分片,如果一个 TCP 分片丢失后,进行重发时也是以 MSS 为单位,而不用重传所有的分片,大大增加了重传的效率
# 三次握手
SYN,Seq Num=client_isn
SYN+ACK,Ack Num=client_isn+1,Seq Num=server_isn
ACK,Ack Num=server_isn+1
第三次握手是可以携带数据的,前两次握手是不可以携带数据的
# 三次原因
避免历史连接
同步双方初始序列号
避免资源浪费
# SYN攻击
攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务
# 对策
# 修改 Linux 内核参数,控制队列大小和当队列满时应做什么处理
net.core.netdev_max_backlog 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包
net.ipv4.tcp_max_syn_backlog SYN_RCVD 状态连接的最大个数
net.ipv4.tcp_abort_on_overflow 超出处理能时,对新的 SYN 直接回报 RST
# tcp_syncookies
net.ipv4.tcp_syncookies = 1
SYN队列满以后,后续服务器收到的包不进入,计算一个cookie值再以SYN+ACK返回给客户端,服务器收到应答报文时合法直接放入Accept队列
# 四次挥手
FIN
ACK
FIN
ACK,主动关闭连接的,才有 TIME_WAIT 状态
# 四次原因
关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据
服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,等服务端不再发送数据时,才发送 FIN 报文给客户端
服务端通常需要等待完成数据的发送和处理,ACK 和 FIN 一般都会分开发送
# TIME_WAIT
# TIME_WAIT(60秒)=2MSL?
MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间
TTL 字段,是 IP 数据报可以经过的最大路由数,MSL>=TTL
网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间
2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的,如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时
# 为什么需要 TIME-WAIT
防止旧连接的数据包
保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;
# TIME_WAIT 过多危害
内存资源占用
对端口资源的占用,一个 TCP 连接至少消耗一个本地端口,占满了所有端口资源,则会导致无法创建新连接
# 保活机制
在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序
net.ipv4.tcp_keepalive_time=7200 保活时间是 7200 秒(2小时),也就 2 小时内如果没有任何连接 相关的活动,则会启动保活机制
net.ipv4.tcp_keepalive_intvl=75 每次检测间隔 75 秒;
net.ipv4.tcp_keepalive_probes=9 检测 9 次无响应,认为对方是不可达的,从而中断本次的连接
在 Linux 系统中,最少需要经过 2 小时 11 分 15 秒才可以发现一个「死亡」连接
# TCP报文格式
# 序号:
在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一 次数据就「累加」一次该「数据字节数」的大小,用来解决网络包乱序问题
# 确认号:
下一次「期望」收到的数据的序列号,在这个序号以前的数据都已经被正常接收,用来解决不丢包的问题
# 六个控制位:
URG
ACK TCP 规定除了最初建立连接时的 SYN包之外该位必须设置为 1
PSH 窗口大小(16位)
PST 表示 TCP 连接中出现异常必须强制断开连接
SYN 表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定
FIN 表示今后不会再有数据发送,希望断开连接
# 可靠性传输
序列号
确认应答
重发控制
连接管理
窗口控制
# 重传机制
超时重传
快速重传
SACK
D-SACK
# 流量控制
操作系统缓冲区与滑动窗口的关系
窗口关闭
糊涂窗口综合症
# 拥塞控制
慢启动
拥塞避免
拥塞发生
快速恢复
# TCP参数
# 用户数据协议 UDP(User Datagram Protocol)
# UDP报文格式
# 网络层(数据报(datagram))
为分组交换网上的不同主机提供通信服务
# IP(Internet Protocol)
# ARP
# NAT
# ICMP
# RIP
# OSPF
# BGP
# 网络接口层
# 数据链路层(帧(frame))
将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧
# 物理层
实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异