wangzhongyang / books

存储电子书,以供平时看看
0 stars 0 forks source link

网络 操作系统相关 #5

Open wangzhongyang opened 2 years ago

wangzhongyang commented 2 years ago

网络

网络分层

网络分层

GET 和 POST 区别

get post
请求参数长度限制 2M(受限于不同的浏览器或服务器) 没有限制
请求参数 一般在URL上,可以带body,但不一定会接收 参数一般在body里
请求缓存 不会
后退 不会重新请求 重新请求
数据类型限制 只允许ASCII字符 无限制

HTTP状态码

状态码 描述
1** 信息,服务器收到请求,需要客户端继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步操作以完成请求
4** 客户端错误,请求中包含语法错误或无法完成请求
5** 服务端错误,服务端正咋处理请求的过程中发生了错误
100 继续请求
101 切换协议
200 请求成功
301 永久移动,请求资源被永久移动到新URL,并放回新URL,浏览器会自动使用新URL请求
302 临时移动,应继续使用旧URL
400 客户端语法错误,服务端无法理解
401 身份认证错误
403 服务器理解请求,但拒绝执行
404 服务端无法根据请求找到资源
500 服务端内部错误,无法完成请求
501 服务器不支持请求功能
502 网关或代理服务器收到远程服务器的无效响应
503 系统超载或维护,暂时无法处理请求
504 网关或代理服务器未及时从远程服务器获取请求timeout

TCP/IP 协议

面向连接的、可靠的、基于字节流的传输控制协议

三次握手四次挥手

  1. 服务器必须准备好接受外来的连接。通常通过调用socket、bind和listen这三个函数完成,称为被动打开
  2. 客户端通过调用connect发起主动打开(active open)。客户将TCP发送一个SYN(同步)= J 分节,它告诉服务器客户端将在连接中发送的数据的初始序列号。通常SYN分节不携带数据,其所在IP数据报只含有一个IP收不、一个TCP收不及可能有的TCP选项
  3. 服务器必须确认(ACK)客户端的SYN,同事自己也得发送一个SYN分节,它含有服务器将在同一个连接中发送的数据的初始序列号。服务器在单个分节中发送SYN=K和对客户SYN的ACK=J+1(确认)
  4. 客户端必须确认服务器的ACK = K+1

    TCP 选项:

    • MSS选项:发送SYN的TCP一端使用本选项同高对端他的最大分节大小即MSS,也就是他在本连接的每个TCP分节中愿意接受字大的数据量。发送端TCP使用接收端的MSS值作为锁发送分节的最大大小。

      四次挥手

    • 原因
    • TCP全双工连接的可靠释放
    • 旧数据报在网络中因过期而消失
    • timewait 2MSL(Maximum Segment Lifetime报文最大生存时间)的作用
    • 保证客户端发送的最后一个ack报文段能够到达服务器:最后一个可能丢失,服务器会超时重传第三次握手的fin,然后客户端再重传第四次回收的ack报文。如果发送完直接关闭,客户端就收不到超时重传的fin(客户端会收到一个非法报文,返回RST数据报表明拒绝此次通信,双发产生异常)
    • 让本次连接产生的所有报文在网络上消失
    • 优化
    • 最好是增加机器
    • 打开系统的timewait重用和快速回收
    • 开启更多的端口

      粘包 拆包 连接中断处理

    • MTU 数据链路层的最大传输单元(netstat -i命令可以查看Mac的数值)
    • MSS TCP建立后双方约定的可传输的最大TCP报文长度
    • 粘包:一次发送多个请求的数据报
    • 原因
    • 要发送的数据小于TCP的发送缓冲区,TCP将多次写入缓冲区一次发送
    • 接收数据段没有及时读取缓冲区中的数据
    • 数据发送过快
    • 拆包:数据包过大超过MSS的长度,就会被拆分成多个TCP数据包传输
    • 解决:
    • netty(java版本)、go-netty
    • 应用数据包前加上包长度
    • 连接中断
    • 服务端中断
      1. 服务端发送fin
      2. 客户端回复ack
      3. 客户端仍可继续发送数据
      4. 服务端返回RST
      5. 客户端报“服务器提前终止”错误,客户端退出
      6. 客户端第二次发送数据,返回SIGPIPE信号,客户端出现“Broken pipe”错误
    • 服务器崩溃
      1. 服务端不发送内容
      2. 客户端发送数据
      3. 客户端超时重传12次,约九分钟放弃重传
      4. 客户端报错“etimedout”错误
    • 服务器崩溃后重启
      1. 服务器丢失连接信息
      2. 客户端发送数据
      3. 服务器返回RST
      4. 客户端报“econnReset”
    • 服务器关机:init进程向所有进程发送SIGTERM信号,进程可以捕获该信号正常退出;等待一段固定时间后,发送SIGKILL信号,进程终止,出现服务端中断现象

      流量控制:滑动窗口

      作用于接受者,控制发送者的速度从而是接收者来得及接收,防止分组丢失

  5. 包含三个动作:合拢、收缩、张开。
  6. 分为发送窗口和接收窗口
  7. ack(下个字节序号)、win(窗口大小)、

    拥塞控制

    作用于网络,防止过多数据注入到网络中,避免出现网络负载过大的情况。发送方维持一个拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度并动态变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑接受方的接收能力,发送窗口可能小于拥塞窗口 拥塞控制

    • 慢开始 慢开始的“慢”并不是增长缓慢,而是起点cwnd为1,然后翻倍至ssthresh(慢开始门限ssthresh状态变量)。

      1. 当cwnd < ssthresh时,使用慢开始算法
      2. 当cwnd > ssthresh时,使用拥塞避免算法
      3. 当cwnd = ssthresh时,使用慢开始或拥塞避免算法
    • 拥塞避免

      1. 拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。
      2. 只要发送方判断网络出现拥塞(其根据就是没有按时收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判断,所以都当做拥塞处理),就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
      3. 乘法减少,加法增大:“乘法减小”指的是无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半,并执行慢开始算法,所以当网络频繁出现拥塞时,ssthresh下降的很快,以大大减少注入到网络中的分组数。“加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞。常合起来成为AIMD算法。 注意:“拥塞避免”并非完全能够避免了阻塞,而是使网络比较不容易出现拥塞。
    • 快重传 连续收到三个重复确认,就立即发送对方尚未收到的报文段

    • 快恢复 乘法减少,加法增大

      PUSH 标识

      发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。接收方完全接收后回复FIN

      UDP 协议优缺点,使用场景,如何优化,拓展协议

    • UDP 协议 User Data Protocol,用户数据报协议,是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。

    • 头信息

      16位源端口号 16位目的端口号
      16位UDP长度 16位UDP校验和
      数据(如果有)
    • 区别

区别

wangzhongyang commented 2 years ago

操作系统相关

Linux命令

命令 用处
chmod 文件权限
find 查找
mv 移动
cp cope
cat 查看
grep 筛选
ssh 远程连接
tcpdump TCP抓包
netstat 网络信息
kill 杀死进程
zip/unzip 压缩解压
top/htop 系统基本使用信息
pstree 进程树信息
ps 进程信息

并发、并行