专注、坚持

计算机网络核心笔记

2021.07.22 by kingcos
Preface · 序
计算机网络是学习计算机的必修课,虽然我们可能很少深入底层,但有些内容了解更多才能支撑我们走的更远。

基础知识

ARP 欺骗

TODO.

传输层 ★

TCP UDP
连接性 面向连接(需要基于连接) 无连接
可靠性 可靠传输,不丢包 不可靠传输,尽最大努力交付,可能丢包
首部大小
传输速率
资源消耗
应用场景 浏览器、文件传输、邮件发送 音视频通话、直播
应用层协议 HTTP、HTTPS、FTP、SMTP、DNS DNS、QUIC(HTTP/3)

UDP

14

  • UDP(User Datagram Protocol)首部中端口占用为 2 个字节,取值范围为 0 ~ 65535;客户端的源端口是临时开启的随机端口。
  • UDP 是无连接的,减少了建立和释放连接的开销
  • UDP 尽最大努力交付,不保证可靠交付,因此不需要维护一些复杂的参数,首部仅占用 8 个字节。

20

  • 常用命令行:
    • netstat -an:查看被占用的端口;
    • netstat -anb:查看被占用的端口、占用端口的应用程序;
    • telnet 主机 端口(Windows):查看是否可以访问主机的某个端口。
协议 默认端口号
HTTP TCP + 80
HTTPS TCP + 443
FTP TCP + 21
MySQL TCP + 3306
DNS TCP / UDP + 53
SMTP TCP + 25
POP3 TCP + 110

TCP

15

  • TCP(Transmission Control Protocol)首部的数据偏移占 4 位,取值范围 0x0101 ~ 0x1111,数据偏移(可以理解为数据部分的偏移)乘 4 为首部长度(Header Length),即 20 ~ 60 字节;保留位目前全为 0
  • UDP 首部中有 2 字节记录整个 UDP 报文段(首部 + 数据)的长度,但 TCP 中仅有 4 位数据偏移记录首部长度而无 TCP 报文段的总长度;UDP 首部中的长度字段也是冗余的,只是为了保证首部是 32 位对齐。
  • 传输层(eg. TCP/UDP)数据长度 = 网络层总长度 - 网络层首部长度 - 传输层首部长度。
  • 标志位(Flags):
    • URG(Urgent):当 URG = 1 时,紧急指针字段才有效,表明当前报文段中有紧急数据,应优先尽快传送;
    • ACK(Acknowledge):当 ACK = 1 时,确认号字段才有效;
    • PSH(PUSH);
    • RST(Reset):当 RST = 1 时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接;
    • SYN(Synchronization):当 SYN = 1,ACK = 0 时,表明这是一个建立连接的请求;若对方同意建立连接,则回复 SYN = 1,ACK = 1;
    • FIN(Finish):当 FIN = 1 时,表明数据已经发送完毕,要求释放连接
  • 序号(Sequence Number):在传输过程的每一个字节都会有一个编号,在建立连接后,序号代表该次传给对方的 TCP 数据部分的第一个字节的编号
  • 确认号(Acknowledge Number):建立连接后,期望对方下一次传过来的 TCP 数据部分的第一个字节的编号
  • 窗口(Window):流量控制,用以告知对方下一次允许发送的数据大小(单位:字节)。
  • TCP 要点:可靠传输流量控制拥塞控制连接管理

可靠传输

16

  • 为了改进 ARQ 的效率,推出了连续 ARQ 协议 + 滑动窗口协议:

21

  • 若重传超出一定的次数时间,仍未收到来自对端的确认报文,将会发送 RST 报文断开连接。
  • 若接收窗口最多能接收 4 个包,但发送方只发了 2 个包,接收方将在等待一定时间(即所谓超时重传)后返回确认收到 2 个包给发送端。
  • SACK(Selective Acknowledge,选择性确认,RFC-2018,告知发送方哪些数据丢失,可以针对性重传。
  • SACK 信息放在 TCP 首部的选项部分,由于选项部分最多 40 字节,因此 SACK 选项最多携带四组边界信息,最大占用字节数据为 34 字节(4 * 8 + 2)。

22

  • TCP 传输层分层的意义:可以提高重传的性能;传输层分段后,一旦出现数据丢失,只需要重传丢失的段即可。

流量控制

  • 流量控制:控制发送方的发送速率,以让接收方能够来得及处理。
  • 原理:通过确认报文中的窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给定的窗口大小,当接收方给定的窗口大小为 0 时,发送方就会停止发送数据。

特殊情况:

一开始接收方给发送方发送了 0 窗口的报文段(此时发送方将停止发送),后面接收方又有了一些存储空间,但给发送方的非 0 窗口的报文段丢失了,为了避免陷入僵局,发送方在停止后将同时开启一个定时器,隔一段时间就主动发个测试报文去询问接收方的最新窗口大小,如果接收的窗口还是 0,则发送方再次刷新启动定时器。

23

拥塞控制

  • 拥塞控制:防止过多的数据注入到网络中,避免网络中的路由器或链路过载。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素,是大家共同努力的结果(相比而言,流量控制是点对点通信的控制)。

25

  • 慢开始(Slow start),慢启动
    • cwnd 的初始值比较小,随着数据包被接收方确认(即收到 ACK),cwnd 成指数增长
    • ssthresh(Slow start threshold):慢开始阈值,cwnd 达到阈值后,以线性方式增加
  • 拥塞避免(Congestion avoidance)
    • 加法增大:cwnd 缓慢增大,防止网络过早拥塞
    • 乘法减小:只要网络出现拥塞,ssthresh 将减为拥塞峰值的一半,同时执行慢开始算法(cwnd 又恢复到初始值,Tahoe,已弃用)
  • 快重传(Fast retransmit)
    • 接收方:每收到一个失序的分组后就立即发出重复确认,使发送方及时知道有分组没有到达,而不用等待自己发送数据时才进行确认
    • 发送方:只要连续收到三个重复确认(带上首个正常确认总共 4 个相同确认),就应当立即重传对方尚未收到的报文段,而不必等待重传计时器到期后的再重传

26

  • 快恢复(Fast recovery)
    • 不同于在拥塞后慢开始,快恢复将 cwnd 值设置为新的 ssthresh 值,并开始执行加法增大,使 cwnd 缓慢增大(Reno)

常用缩写:

MSS(Maximum Segment Size):每个段最大的数据部分大小(在建立连接时确定,如下图),MSS = 数据链路层 MTU(1500) - 网络层首部长度(20)- 传输层首部(20)= 1460 24 cwnd(Congestion window):拥塞窗口 rwnd(Receive window):接收窗口 swnd(Send window):发送窗口(swnd = min(cwnd, rwnd),当 rwnd < cwnd接收方的接收能力限制了发送窗口最大值,当 cwnd < rwnd网络的拥塞限制了发送窗口的最大值)

连接管理

27

  • 三次握手:

28

  • 前两次握手的特点:
    • SYN 都设置为 1
    • 数据部分长度均为 0
    • TCP 头部的长度一般都是 32 字节(固定首部 20 字节,选项部分 12 字节)
    • 交换信息,MSS、是否支持 SACK、Window Scale(窗口缩放系数)等(均放在选 TCP 头部的选项部分(12 字节))

Q:为什么建立连接需要进行三次握手?

A:主要目的:防止服务端一直等待,浪费资源。

Reference