TCP和UDP
目录
TCP
头部信息
TCP连接过程
三次握手
四次挥手
TCP的可靠性
UDP
头部信息
传输过程
两者的区别
使用场景
TCP
TCP是一种面向连接的,可靠性高,可以流量控制,适合传输大量数据的协议,但需要进行三次握手因此耗时长
什么是面向链接?在正式传输数据之前,先适用预先的协议,建立点到点的链接。TCP便是建立了一个双向的会话连接,通讯双方都可以向对方发送数据。
头部信息
最短有20字节
- 源/目的端口号:用于建立端到端的连接
- seq序号(32位):本次发送报文的第一个字节编号
- ack确认序号(32位):期望收到的下一个字节编号
- 首部长度:数据偏移,指出报文数据开始的地方距离TCP报文段起始处有多远
- ACK:响应确认
- PSH:推送标志,立即将缓存中的数据推送给相应进程
- PST:复位标志,重新建立连接
- SYN:建立连接
- FIN:关闭连接
- 窗口大小:告知接收窗口的大小(发送<=接收)
- 校验和:校验范围包括首部和数据以及伪首部,校验方式:将16位按1的补码形式相加,然后对和取反
- 紧急指针和URG:URG配合紧急指针,当URG=1,紧急指针有效,紧急指针给出紧急报文的最后一个字节的序号;紧急指针用于传输大量数据中途发现问题时,需要停止程序的运行
TCP连接过程
三次握手
- 第一次握手(SYN=1,seq=x):由客户端发出连接请求到服务器
- 第二次握手(SYN=1,seq=y,ACK=1,ack=x+1):再由服务器回话个客户,让客户知道自己已经收到了它的连接建立的请求,同时也告诉客户端我也同意建立连接
- 第三次握手(SYN=1,seq=x,ACK=1,ack=y+1):客户端在此回话表示收到服务器同意建立连接的报文,此时双方方可以稳定建立连接,三次握手完成时就可以进行数据传输。
必须进行三次的原因:三次是最少必要交互次数,能够确保通信双方都能接受并发送数据建立稳定连接;如果只有两次握手,只能确保客户端-->服务器可达,服务器无法确认客户端能否接收到自己发送的数据(SYN=1,seq=y,ACK=1,ack=x+1),第三次握手确认了客户端能够接收到服务器的信息
四次挥手
- 第一次挥手(FIN=1,seq=u):客户端给服务器发出连接断开请求
- 第二次挥手(ACK=1,seq=v,ack=u+1):当服务器收到后,给客户端回复,表明收到断开连接的请求
- 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1):再次由服务器给客户端发送关闭连接的请求
- 第四次挥手(ACK=1,seq=u+1,ack=w+1):客户端收到后,再次给服务器发送同意的信息时,不会立马关闭连接,等服务器关闭连接后,客户端立马关闭连接
前两次是断开客户端-->服务器的连接
后两次是断开服务器-->客户端的连接
TCP的可靠性
TCP的可靠性源自于核心机制:确认,重传,排序,流控
确认:接收方告知发送方数据已经成功接收,有两种实现方式
- 累积确认:累积收到一段数据后,发送ACK为期望收到的下一个字节的序号(收到序号为1-1000的数据,发送的ACK=1001)
- 选择确认:通过扩展选项明确改制哪些数据块已经收到,减少不必要的重传
重传:即重新发送数据包,有两种触发条件
- 超时重传:发送方在一定时间(RTO)内未收到ACK回复
- 快速重传:连续收到3次重复的ACK,则认为传输的数据丢失,立即重传
排序:为确保数据按发送顺序交付给应用层,每个字节分配唯一的序号(seq),接收方在缓存存放混乱序号的数据,知道缺失序号到达后排序(通过滑动窗口管理发送和接收的顺序)
流控:防止发送方速率过快导致接收方缓存区溢出(解决接收方缓存区溢出)
- 滑动窗口:发送方通过TCP头部报文的窗口大小字节知道接收方缓存区的大小,发送的数据大小<=窗口大小
- 动态调整:发送方根据窗口值调整发送速率
- 零窗口探测:接收方窗口为0时(即缓存区已满),发送方定期发送探测报文
拥塞控制(有关滑动窗口的关键算法,区别于流控,拥塞用于解决网络堵塞问题)
慢启动:窗口(cwnd)从1开始,每次收到ACK回复后 cwnd*2 指数增长,增长直到达到慢启动阈值(ssthresh)或发生丢包。
拥塞避免:当
cwnd >= ssthresh
时,每次收到ACK回复后cwnd+1,增长至阈值。快恢复:当收到重复ACK表示丢包但网络仍有流动性时,窗口减半,避免全局同步。
慢启动(指数增长) ---> 拥塞避免(线性增长) --发生丢包--> 严重:慢启动,cwnd=1,阈值减半;轻微:快恢复,cwnd减半接着传输
UDP
UDP是面向数据报的,不那么可靠,但传输速度快,适合少量数据
头部信息
- 源/目端口号:建立端到端的连接
- TTL生存时间:数据包每经过一个路由器的转发,其数值减1,当一个数据包的TTL值为0时,路由器将不再转发而直接丢弃
- 校验和:检测数据报完整性
传输过程
发送端
- 应用程序将数据交给UDP协议
- 协议将数据分割成数据报,添加头部信息
- 数据报通过网络传输给接收端
接收端
- 接收到数据报后将数据交给UDP
- UDP验证校验和,去掉头部后将数据交给上层对应的应用程序
两者的区别
- TCP是面向链接的协议,而UDP是无连接的协议
- TCP协议的传输是可靠的,而UDP协议的传输是”尽力而为“
- TCP协议可以实现流控,而UDP不行
- TCP可以分段,而UDP不行
- TCP小号资源较大,传输效率较低,而UDP小号资源小,速度快
使用场景
- TCP协议更适用于对可靠性要求较高,但是对传输效率和资源占用要求较低的场景(电子邮件、文件传输)
- UDP更适用于对传输效率要求较高,可靠性要求较低的场景(实时会议、直播、多人游戏)