TCP/IP协议
UDP协议
- UDP协议端格式:
- DUP特点:
- 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接;
- 不可靠: 没有确定机制,没有重传机制,如果因为网络故障该段无法发送到对方,UDP协议层也不会给应用层返回任何错误信息;
- 面向数据报: 不能够灵活的控制读写数据的次数和数量( 只能一次发送,一次接受 );
面向数据报: 应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
- 有接收缓冲区, 没有发送缓冲区;
UDP的socket既能读, 也能写, 这个概念叫做全双工;
- 大小受限;
UDP协议首部中有一个16位的最大长度, 也就是说一个UDP能传输的数据最大长度是64K(包
含UDP首部), 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装.
TCP协议
TCP:
- TCP协议段格式
- 6位标志位
标志位 | 作用 |
---|---|
URG | 紧急指针是否有效 |
ACK | 确认号是否有效 |
PSH | 提示接收端应用程序立刻从TCP缓冲区把数据读走 |
RST | 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段 |
SYN | 请求建立连接; 我们把携带SYN标识的称为同步报文段 |
FIN | 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段 |
TCP原理/机制
序列号:
TCP将每个字节的数据都进行了编号. 即为序列号.
每一个ACK都带有对应的确认序列号, 意思是告诉发送者已经收到了哪些数据; 下一次从哪里开始发.
- 确认应答(ACK)机制
图示:
收到一条报文后,向发送端发送一条确认ACK,此ACK的作用就是告诉发送端:接收端已经成功的收到了消息,并且希望收到下一条报文的序列号是什么
- 超时重传机制
发送端发送的数据报超过一定时间间隔没有收到确认应答的数据报, 表示之前发送的数据报可能丢包, 所以要重新发送.
一定时间间隔: 发送端不能无限期的等待
如何确定超时时间?
- 系统动态的计算:初始有一个默认的超时时间(500ms),每次重传, 超时时间会在上一次超时时间基础上 *2;
- 重传达到一定的次数后, 认为无法正常发送数据, 关闭连接.
丢包: 1 .发送的数据数据报丢包 2. 确认应答的数据报丢包
- 连接管理机制
连接: 客户端和服务端, 每一端来说, 保持一个本端到对端的连接状态
建立连接:
- 建立客户端到服务端的连接(连接状态保存在客户端)
- 建立服务端到客户端的连接(连接状态保存在服务端)
三次握手 —— 建立连接
(1)客户端发送SYN数据报到服务端, 申请建立客户端到服务端的连接 ;
(2)服务端返回SYN+ACK给客户端 ;
- ACK是对第一次SYN的应答, SYN是申请建立服务端到客户端的连接
- 客户端接受到该数据报, 建立客户端到服务端的连接
(3)客户端返回ACK给服务端
- ACK是对第二次SYN的应答
- 服务端接收到该数据报,建立服务端到客户端的连接
四次挥手 —— 关闭连接
(1)客户端发送FIN 到服务端, 申请关闭连接(客户端到服务端的连接)
服务端接收到该数据报, 状态置为 COLSE_WAIT
(2)服务端返回ACK给客户端
- ACK是对第一次FIN的应答
- 返回ACK, 是操作系统实现TCP协议栈的时候, 默认的机制, 系统自动返回
(3)服务端发送FIN到客户端, 申请关闭连接(服务端到客户端的连接)
- 客户端接收到该数据报,状态置为 TIME_WAIT
- 程序手动调用 CLOSE 关闭连接(发送FIN)
(4)客户端返回ACK给服务端
ACK是对第二次FIN的应答
TCP状态转换总图:
- 滑动窗口
如何确定窗口大小?
窗口大小=min( 流量窗口大小, 拥塞窗口大小 )
滑动: 发送且没有返回ACK的数据, 都保存在发送缓冲区, 接收到下一个是 x 的ACK之后, 可以计算出可以滑动的大小
- 流量控制 —— 接收端安全
接收端处理数据的速度是有限的, 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.
因此TCP支持根据接收端的处理能力, 来决定发送端的发送速度, 这个机制叫做流量控制.
作用: 间接的控制发送端滑动窗口大小(发送数据的大小)
- 拥塞控制 —— 发送端安全
虽然TCP有了滑动窗口能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题.
因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据, 是很有可能引起雪上加霜的.
发送端在不了解网络状态的情况下, 采取慢启动机制, 先发少量的数据探路, 摸清网络拥堵情况, 在决定按多大的滑动窗口发送数据.
- 当TCP开始启动的时候, 慢启动阈值等于窗口最大值;
- 在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1;
少量的丢包, 触发超时重传; 大量的丢包, 就认为网络拥塞;
当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降;
拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案.
- 延迟应答 —— 提高效率
马上应答, 返回的流量窗口大小会比较小, 接收端处理速度较快, 稍等一段时间, 接收端消费一些接收缓冲区数据后, 再返回的流量窗口大小会更大一些. 发送端设置的滑动窗口大小就可以更大, 网络数据传输的吞吐量就更高.
- 所有的包都可以延迟应答么?
不是
数量限制: 每个N个包就应答一次
时间限制: 超过最大延迟时间就应答一次
- 捎带应答
不管哪一端(客户端/服务端), 需要主动发送的数据报, 可以和接收数据报后返回的ACK数据报, 合并为一个.
类似TCP三次握手中, 第二次合并SYN和ACK的数据报
总结
/ | TCP | UDP |
---|---|---|
连接 | 有连接 | 无连接 |
可靠性 | 可靠 | 不可靠 |
效率 | 相对UDP效率低 | 效率高 |
面向 | 面向字节流(多次发, 多次收) | 面向数据报(一次发, 一次收) |
缓冲区 | 有接收缓冲区, 也有发送缓冲区 | 有接收缓冲区, 没有发送缓冲区 |
数据大小 | 不受限 | 受限 |