小码哥《网络协议从入门到底层原理》笔记(七):传输层、UDP、TCP可靠传输

1,210 阅读3分钟

我的Github地址

小码哥《恋上数据结构与算法》笔记

极客时间《iOS开发高手课》笔记

iOS大厂面试高频算法题总结

iOS面试资料汇总

传输层(Transport)

  • 传输层有2个协议
    • TCP(Transmission Control Protocol),传输控制协议
    • UDP(User Datagram Protocol),用户数据报协议

UDP

数据格式

  • UDP是无连接的,减少了建立和释放连接的开销。
  • UDP尽最大能力交付,不保证可靠交付。
    • 因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)。
  • UDP长度(Length)
    • 16位,首部的长度 + 数据的长度。

检验和

  • 检验和的计算内容:伪首部 + 首部 + 数据
    • 伪首部:仅在计算检验和时起作用,并不会传递给网络层。

端口

  • UDP首部中端口是占用2字节。
    • 可以推测出端口号的取值范围是:0~65535
  • 客户端的源端口是临时开启的随机端口。
  • 防火墙可以设置开启/关闭某些端口来提高安全性。
  • 常用命令行
    • netstat -an:查看被占用的端口
    • netstat -anb:查看被占用的端口, 占用端口的应用程序
    • telnet 主机 端口:查看是否可以访问主机的某个端口

TCP

数据格式

  • 数据偏移
    • 占4位,取值范围是0x0101~0x1111
    • 乘以4:首部长度(Header Length)
    • 首部长度是20~60bytes
  • 保留
    • 6位,目前全为0

一个细节

  • 为什么TCPUDP首部记录数据长度的位数不一样?
    • UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部 + 数据)
    • 但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度, 并没有字段记录TCP报文段的数据长度
    • 分析
      • UDP首部中占16位长度字段是冗余的,纯粹是为了保证首部是32bit对齐
      • TCP/UDP的数据长度,完全可以由IP数据包的首部推测出来
      • 传输层的数据长度 = 网络层的总长度 - 网络层的首部长度 - 传输层的首部长度

检验和

  • 跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据
    • 伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层

标志位

  • URG(urgent)
    • URG = 1时, 紧急指针字段才有效, 表明当前报文段中有紧急数据, 应优先尽快传送
  • ACK(Acknowledgment)
    • ACK = 1时, 确认号字段才有效
  • PSH(Push)
  • RST(Reset)
    • RST = 1时, 表明连接中出现严重差错, 必须释放连接, 然后再重新建立连接
  • SYN(Synchronization)
    • SYN = 1, ACK = 0时, 表明这是一个建立连接的请求
    • 若对方同意建立连接, 则回复SYN = 1, ACK = 1
  • FIN(Finish)
    • FIN = 1, 表明数据已经发送完毕, 要求释放连接

序号、确认号、窗口

  • 序号(Sequence Number)
    • 4字节
    • 首先,在传输过程的每一个字节都会有一个编号
    • 在建立连接后,序号表示:这一次传给对方的TCP数据部分的第一个字节的编号
  • 确认号(Acknowledgement Number)
    • 4字节
    • 在建立连接后,确认号代表:期望对方下一次穿过来的TCP数据部分的第一个字节的编号
  • 窗口(Window)
    • 2字节
    • 这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小(字节为单位)