《图解TCP/IP》笔记(十四)传输层两大协议TCP和UDP
前言:这是我《图解TCP/IP》笔记系列最后一篇(咕咕咕了将近两个月hh),TCP UDP其实面试的时候经常问到!
目录
传输层的定义:
OSI参考模型中的第四层。
传出层协议为网络端点主机上的进程之间提供了可靠、有效的报文传送服务,其功能紧密地依赖于网络层的虚拟电路或数据报服务。
传输层定义了主机应用程序之间端到端的连通性。
TCP与UDP对比
- TCP传输控制协议;UDP用户数据报协议。
- 连接:TCP面向连接,可靠的流协议;UDP是不具可靠性的数据报协议,细微的处理会交给上层的应用处理。
- 服务对象:TCP是点对待你的两点间服务,即一条TCP连接只能有两个端点;UDP支持一对一、一对多,多对一、多对多的交互通信。
- 拥塞控制、流量控制:TCP有拥塞控制和流量控制保证数据传输的安全性;UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。
- 报文长度:TCP是动态报文长度,TCP报文长度时根据接收方的窗口大小和当前网络拥塞情况来决定的;UDP面向报文,不合并、不拆分,保留上面传下来的报文边界。
- 首部开销:TCP首部开销大,20个字节;UDP首部开销小,8个字节。
- 适用场景:通信数据的完整性让位于通信实时性,选择TCP(如文件传输、重要状态更新);反之用UDP(如视频传输、实时通信等)
端口号
在传输层中类似地址的概念,用来识别用一台计算机中进行通信的不同应用程序,也被称为程序地址。
类比数据链路层中的MAC地址,IP中的IP地址。
通信识别:
源IP地址+目标IP地址+协议号+源端口号+目标端口号
确定端口号的方法:
方法一:标准既定的端口号
也称为静态方法,指每个应用程序都有其指定的端口号。
例如HTTP、FTP、TELNET等应用层程序对应的使用的端口号就是固定的,如下表:
方法二:时序分配法
也称为动态分配法,服务器要求必须要有监听端口号,但是接受服务的客户端没必要确定端口号。此时客户端应用程序完全不用自己设置端口号而全权交给操作系统进行分配。
动态分配的端口号取值范围在49152~65535之间。
TCP首部和UDP首部
TCP首部的格式
- 源端口号:表示发送端端口号,字段长16位
- 目标端口号:表示接收端端口号,字段长16位
- ***:字段长32位,***指的是发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小;
- 确认应答号:字段长32位,指的是下一次应该收到的数据的***。
- 数据偏移:字段长4位,单位为4字节,即一共32位。表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,也可以看做是TCP首部的长度。
- 保留:字段长4位,为了以后扩展时使用,一般设置为0。
- 控制位:字段长为8位,从左到右分别为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN
UDP首部的格式
- 源端口号:字段长16位,表示发送端端口号,该字段是可选项,优势可能不会设置源端口号。没有源端口号时设置为0,可用于不需要返回的通信中。
- 目标端口号:字段长16位,表示接受端端口号。
- 包长度:字段长为8字节,保存了UDP首部的长度根数据的长度之和。
- 校验和:为了提供可靠的UDP首部和数据而设计,在计算校验和是,附加在UDP伪首部与UDP数据报之前,通过在最后一位增加一个“0”将全长增加16倍。
其他传输层协议:UDP-Lite、DCCP、SCTP
UDP-Lite
轻量级用户数据包协议,扩充UDP机能的一种传输层协议。
提供与UDP几乎完全一样的功能,不过计算校验和的范围可以由应用自行决定!
DCCP
数据包拥塞控制协议
辅助UDP的崭新的传输层协议,面向连接,可靠的。
能够根据网络拥堵情况进行拥塞控制,接收端收到包以后返回确认应答,该确认应答将被用于重发与否的判断。
SCTP
流控制传输协议
提供数据到达与否相关可靠性检查的传输层协议
以消息为单位首发
支持多重宿组
支持多数据流通信
可以定义消息的生存期限
TCP可靠性传输机制
1. 三次握手&&四次挥手:可靠性的基础
虽然TCP有窗口控制、重发控制等等这些可靠性方法,千万不要忘记了三次握手、四次挥手是TCP可靠性的基础!
2. ***、确认应答、超时重传
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接受的数据***。
如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这是发送方在等待一定时间后进行重传,这个时间一般是2*RTT(报文段往返时间)+一个差值。
3. 窗口控制与高速重发机制/快速重传(重复确认应答)
在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。
4. 拥塞控制
- 慢启动:定义拥塞窗口,一开始将该窗口设为1,之后每次收到确认应答(经过一个RTT),将拥塞窗口大小*2。
- 拥塞避免:设置慢启动闸值,一般开始为65536,。拥塞避免是指当拥塞窗口大小达到这个闸值,拥塞窗口的值不再指数上升,而是加法增加(每次加一)来避免拥塞。
- 快速重传:在遇到三次重复确认应答(高速重发机制),代表收到了3个报文段,但是之前的一个端丢失了,就立即对其进行重传,然后先将闸值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动闸值+3。