5、传输层和网络层协议
一、传输层协议分类
TCP/IP协议族的传输层协议主要包括TCP(Transfer Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。TCP是面向连接的可靠的传输层协议,它支持在并不可靠的网络上实现面向连接的可靠的数据传输。UDP是无连接的传输协议,主要用于支持在较可靠的链路上的数据传输,或用于对延迟较敏感的应用。传输层协议定义了通信两端之间是否需要建立可靠的连接关系,如果需要那么传输层就需要封装TCP的头部,如果不需要就封装UDP的头部。
二、TCP协议简介
1、TCP协议特点
①三次握手(Three-Way Handshake)建立连接:确保连接建立的可靠性。
②端口号:通过端口号标识上层协议和服务,实现了网络通道的多路复用。
③完整性校验:通过对协议和载荷数据计算校验和(Checksum),保证了接收方能检测出传输过程中可能出现的差错。
④确认机制:对于正确接收到的数据,接收方通过显式应答通告发送方,超出一定时间之后,发送方将重传没有被确认的段,确保传输的可靠性。
⑤序列号:发送的所有数据都拥有唯一的序列号,这样不但唯一标识了每一个段(segment),而且明确了每个段在整个数据流中的位置,接收方可以利用这些信息实现确认、丢失检测、乱序重排等功能。
⑥窗口机制:通过可调节的窗口,TCP接收方可以通告期望的发送速度,从而控制数据的流量。
2、TCP头部
Source port | 源端口,标识哪个应用程序发送,长度为16比特 |
Destination port | 目的端口,标识哪个应用程序接收,长度为16比特 |
Sequence number/Acknowledgement number | Sequence number表示发送数据包的编号,Acknowledgement number用来对所收到的报文进行确认,确保可靠性和有序性 |
Header length | 头部长度,指出TCP报文头部长度 |
Reserved | 保留,必须填0,长度为4比特 |
Control bits | 控制位,包含FIN、ACK、SYN等标志位,代表不同状态下的TCP数据段 |
Window | 用来控制每次传递数据的量,窗口最大为65535字节,长度为16比特 |
Checksum | 对于TCP头部和TCP数据进行一个校验,接收方也做一个校验,确保数据传递过程中一个完整性 |
Urgent | 指针位用不到 |
Options | 可选位 |
三、TCP的工作原理
1、TCP三次握手建连接
任何基于TCP的应用,在发送数据之前,都需要由TCP进行“三次握手”建立连接,TCP连接建立的详细过程如下。
- 由TCP连接发起方(图中PC1),发送第一个SYN位置1的TCP报文。初始序列号a为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认序列号为0。
- 接收方(图中PC2)接收到合法的SYN报文之后,回复一个SYN和ACK置1的TCP报文。初始序列号b为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为a+1。
- PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文,此时序列号为a+1,确认序列号为b+1。PC2收到之后,TCP双向连接建立。握手过程确保TCP只有在两端一致同意的情况下,才会打开一个连接。
2、TCP四次握手终止连接
当数据传输完成,TCP需要通过“四次挥手”机制断开TCP连接,释放系统资源,TCP连接终止的详细过程如下。
- 由PC1发出一个FIN字段置”1”的不带数据的TCP段。
- PC2收到PC1发来的FIN置位的TCP报文后,会回复一个ACK置位的TCP报文。
- 若PC2也没有需要发送的数据,则直接发送FIN置位的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN置位的TCP报文去关闭连接。
- PC1收到FIN置位的TCP报文,回复ACK报文,TCP双向连接断开。TCP连接至此终止,可见这是一个四次握手过程,终止连接两端可以不一致。
3、传输确认和超时重传
TCP并不要求对每个数据包一对一地发送确认,接收端可以用一个ACK确认之前收到的所有数据。例如,接收到的确认序列号为N+1时,表示接收方对到N为止的所有数据全部正确接收。Sender发送了三个数据包,Receiver回复ACK=3,表明我收到了前两个数据包,Sender就知道网络拥塞,重传第三个报文。
4、滑动窗口
Window用来控制每次接收TCP报文的数量,滑动窗口可以基于网络情况进行动态调整,如果网络空闲每次就多传递些TCP报文,如果网络拥塞每次就少传递些TCP报文,详细过程如下。
- 首先是PC1和PC2之间三次握手建立TCP连接。在报文的交互过程中,PC1将自己的缓冲区大小(窗口大小)3发送给PC2,PC2同理,这样双方就知道了对端的窗口大小。
- PC1连续发送3个单位的数据,在这一波数据发送完后,PC1就不能再发了,需等待PC2的确认。
- PC1发送过来的数据逐渐将PC2缓冲区填满。
- PC2向PC1发送一个ACK,这个报文中指示窗口大小为1。PC1收到PC2发过来的ACK消息,并且知道PC2将窗口大小调整为1,因此他只发送了一个单位的数据并且等待PC2的下一个确认报文。
5、TCP的慢启动拥塞避免的机制
TCP检测到网络是空闲的,窗口大小呈指数级别启动。网络一旦发生拥塞,就是出现大量的TCP的重传,窗口大小降低为原来的一半,再指数级别启动。
四、UDP协议简介
1、UDP头部
Source port | 源端口,标识哪个应用程序发送,长度为16比特 |
Destination port | 目的端口,标识哪个应用程序接收,长度为16比特 |
Length | 该字段指定UDP报头和数据总共占用的长度 |
Checksum | 对于UDP头部进行一个校验,接收方也做一个校验,确保数据传递过程中一个完整性 |
2、TCP和UDP的对比
UDP报文没有序列号、确认、超时重传和滑动窗口,没有任何可靠性保证。因此基于UDP的应用和服务通常工作于可靠性较高的网络环境下。当然,使用UDP作为传输层协议也有独特的优势。
- 实现简单,占用资源少。
- 带宽浪费少,传输效率高,因为UDP头比TCP头尺寸小。
- 延迟小,适合低延迟的业务。
五、端口号
IP头部中的协议号如果是6表示上层是TCP头部,如果是17表示上层是UDP头部。传输层头部中的源端口一般随机分配,目标端口则由服务器的应用指定。源端口号一般为系统中未使用的,且大于1023。目的端口号为服务端开启的应用(服务)所侦听的端口,如HTTP缺省使用80。