此为摘抄杂记,仅供个人查阅。
用户数据协议(UDP)
用户数据协议(User Datagram Protocol UDP):Ineternet 传输层协议, 提供无连接、不可靠、数据报尽力传输服务。
UDP特点:
应用进程更容易控制发送什么数据以及何时发送,会出现分组的丢失和重复。
无需建立连接。
无连接状态。
首部开销小,只有 8 个字节。
UDP 数据报结构:
image.png
UDP 首部四个字段,每个字段长度都是 2 个字节,共 8 个字节。
源端口号和目的端口号:用于 UDP 实现复用和分解 。
长度:指示 UDP 报文段中的字节数(首部和数据的总和)。
校验和:接收方使用来检测报文段是否出现差错。
UDP 校验和
UDP 校验和计算规则:
所有参与运算的内容(包括 UDP 报文段)按 16 位对齐求和。
求和过程中遇到任何溢出(即进位)都被回卷(即进位与和的最低为再加), 最后得到的和取反码,就是 UDP 的校验和,填入 UDP 数据报的校验和字段。
UDP 在生成校验和时,校验和字段全取 0。
UDP 伪首部:
image.png
源 IP 地址、目的 IP 地址、协议号:均是封装对应 UDP 数据报的 IP 分组的对应字段。
UDP 长度字段:是该 UDP 数据报的字段,该字段参与计算两次。
UDP 协议号:17。
传输控制协议(TCP)
传输控制协议(Transmission Control Protocol ,TCP):Internet 传输层协议。提供面向连接、可靠、有序、字节流 传输服务。
应用进程好似在”打电话“要先建立连接。
每一条 TCP 连接只有两个端点。
可靠交付:无差错,不丢失,不重复,按序到达
全双工通信。
面向字节流。流:字节序列。应用程序和 TCP 的交互是一个个数据
块,TCP 把他们看做是无结构字节流。
TCP 报文段结构
image.png
源端口号字段,目的端口号字段分别占 16 位。多路复用/分解来自或送到上层应用的数据。
序号字段、确认序号字段分别占 32 位。
序号字段:TCP 的序号是对每个应用层数据的每个字节进行编号, 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。
首部长度字段占 4 位。指出 TCP 段的首部长度,以 4 字节为计算单位。
最短是 20 字节;最长是 60 字节。
保留字段占 6 位。保留为今后使用,目前值为 0。
URG、ACK、PSH、RST、SYN、FIN 各占 1 位。为标志位字段;
各占 1 位,取值为 0 或 1;
紧急 URG=1,紧急指针字段有效,优先传送。
确认 ACK=1,确认序号字段有效;ACK=0 时,确认序号字段无效。
推送 PSH=1,尽快将报文段中的数据交付接收应用进程,不要等缓存满了再交付。
复位 RST=1,TCP 连接出现严重差错,释放连接,再重新建立 TCP 连接。
同步 SYN=1,该 TCP 报文段是一个建立新连接请求控制段或者同意建立
新连接的确认段。
终止 FIN=1,TCP 报文段的发送端数据已经发送完毕,请求释放连接。
接收窗口字段占 16 位。向对方通告我方接收窗口的大小。
校验和字段占 16 位。校验和字段检验的范围类似于 UDP,计算方法与 UDP 校验和的计算方法相同。TCP 协议号是 6。
紧急指针字段占 16 位。
URG=1 时,才有效。指出在本 TCP 报文段中紧急数据共有多少个字节。
选项字段长度可变,基本不用。最短为 0 字节,最长为 40 字节。 例如:发送方告诉接收方其缓存能够接收的数据段的最大长度是 MSS 个字节。 【最大报文段长度(Maximum Segment Size,MSS):报文段中封装的应用层数据的最大长度。】
填充字段,取值全为 0,目的是为了整个首部长度是 4 字节的整倍数。
TCP 连接管理
TCP 连接管理:
连接建立(三次握手)
连接拆除(四次挥手)
连接建立:
image.png
第一次握手:
客户向服务器发送连接请求段:SYN 报文段:(SYN=1,seq=x)
SYN=1:建立连接请求控制段
seq=x:表示传输的报文段的第 1 个数据字节的序列号是 x,并以此序列号代表 整个报文段的序号(补充:sequence number,序号的意思。)
客户端进入 SYN_SEND(同步发送)
第二次握手:
服务器收到 TCP 连接请求段后,如同意,则发回确认报文段:(SYN=1,ACK=1,seq=y, ack_seq=x+1)
SYN=1:同意建立新连接的确认段
ack_seq=x+1:表示已经收到了序列号为 x 的报文段,准备接收序列号为 x+1 的报文段。
seq=y:服务器告诉客户确认报文段的第 1 个数据字节的序列号是 y。 服务器由 LISTEN 进入 SYN_RCVD(同步收到)
第三次握手:
只有第三次握手可携带数据。
客户对服务器的同意连接报文段进行确认:(ACK=1,seq=x+1,ack_seq=y+1)
seq=x+1:客户传输的报文段的第一个数据字节的序列号是 x+1
ack_seq=y+1:客户期望接收服务器序列号为 y+1 的报文段。
当客户发送 ACK 时,客户端进入 ESTABLISHED 状态;
当服务收到 ACK 后,也进入 ESTABLISHED 状态;
为什么需要三次握手:
第一次握手:客户发送请求,此时服务器知道客户能发。
第二次握手:服务器发送确认,此时客户知道服务器能发能收。
第三次握手:客户发送确认,此时服务器知道客户能收。
连接拆除:
第一次挥手:
客户向服务器发送释放连接报文段:(FIN=1,seq=u)
首部的 FIN=1:TCP 报文段的发送端数据发送完毕,请求释放连接。
序号 seq=u:表示传输的第一个数据字节的序号是 u
客户端状态由 ESTABLISHED 进入 FIN_WAIT_1(终止等待 1 状态)
第二次挥手:
服务器向客户发送确认段:(ACK=1,seq=v,ack_seq=u+1)
ACK=1:标识确认字号段有效。
确认序号 ack_seq=u+1:表示服务器期望接收客户数据包序号为 u+1 的包
序号 seq=v:表示服务器传输的第一个数据字节的序号是 v
服务器状态由 ESTABLISHED 进入 CLOSE_WAIT(关闭等待)
客户端收到 ACK 段后,由 FIN_WAIT_1 进入 FIN_WAIT_2
第三次挥手:
服务器向客户发送释放连接报文段:(FIN=1,ACK=1,seq=w,ack_seq=u+1)
FIN=1:请求释放连接
ACK=1:标识确认字号段有效。
确认序号 ack_seq=u+1:表示服务器期望接收客户数据包序号为 u+1 的包
序号 seq=w:表示自己传输的第一个数据字节的序号是 w
服务器状态由 CLOSE_WAIT 进入 LAST_ACK(最后确认状态)
第四次挥手:
客户向服务器发送确认段:(ACK=1,seq=u+1,ack_seq=w+1)
ACK=1:标识确认字号段有效。
确认序号 ack_seq=w+1:表示客户期望接收服务器数据包序号为 w+1 的包
序号 seq=u+1:表示客户传输的第一个数据字节的序号是 u+1
客户端状态由 FIN_WAIT_2 进入 TIME_WAIT,等待 2MSL 时间,进入 CLOSED 状态,释放连接
服务器在收到最后一次 ACK 段后,由 LAST_ACK 进入 CLOSED,释放连接
TCP 可靠数据传输
TCP 实现可靠数据传输服务的工作机制:
分段:应用数据被分割成 TCP 认为最适合发送的数据块。
TCP 发出一个段后,启动一个计时器,等待目的端确认收到这个报文段。
TCP 首部中设有校验和字段,用于检测数据在传输过程中是否发生差错。
TCP 报文段的到达也可能会失序。如果必要,TCP 会重新排序。
存在网络延迟和重传机制,接收端可能会收到多个重复的报文段,这时接收端需要根据序号把重复的报文段丢弃。
TCP 能够提供流量控制。
TCP 生成 ACK 的策略:
具有所期望序号的报文段按序到达,所有在期望序号及以前的报文段都已被确认。TCP 延迟发送 ACK,约 500ms。
具有所期望序号的报文段按序到达、且另一个按序报文段在等待 ACK 传输,TCP 接收方立即发送单个累计 ACK,确认以上两个按序到达报文段。
拥有序号大于期望序号的失序报文段到达,TCP 接收方立即发送重复 ACK,只是下一个期望接收字节的序号。
收到一个报文段,部分或完全填充接收数据间隔。
image.png
image.png
TCP 拥塞控制
通过合理调度、规范、调整向网络中发送数据的主机数量、发送速率、数据量,以避免拥塞的发生。
TCP 拥塞控制的算法包括:慢启动;拥塞避免;快速重传;快速恢复。
慢启动:阈值之前的阶段称之为慢启动阶段,每经过 RTT,拥塞窗口大小加倍。
拥塞避免:阈值之后的阶段称之为拥塞避免阶段,每经过 RTT,拥塞窗口大小增加 1。
快速恢复算法:当发生 3 次重复确认时,不再从慢启动阶段开始,而是直接从新的阈值开始,直接进拥塞避免阶段。
新阈值(12) =当前窗口(24)的一半;新拥塞窗口=新阈值。
计时器超时:可判定发生拥塞且拥塞严重
image.png
窗口调整的基本策略 AIMD(Additive Increase,Multiplicative Decrease):网络未发生拥塞时,逐渐“加性”增大窗口。网络拥塞时“乘性”快速减小窗口大小。
拥塞消除策略:先拥塞检测,再采取措施。
拥塞预防策略:流量整形技术,规范主机向网络发送数据的流量。
TCP 流量控制
协调发送方与接收方的数据发送与接收速度。在通信过程中,接收方设置报文段的接收窗口字段来将窗口大小通知给发送方。