HCIA-06-传输层协议
传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)。
- TCP
- TCP是一种面向连接的传输层协议,可提供可靠的传输服务。
- TCP位于TCP/IP模型的传输层,它是一种面向连接的端到端协议。
- TCP作为传输控制协议,可以为主机提供可靠的数据传输。
- 在两台主机通信之前,需要TCP在它们之间建立可靠的传输通道。
- TCP端口号
端口号用来区分不同的网络服务;
- FTP协议的端口号为 21、20;
- HTTP协议的端口号为80;
- SMTP协议的端口号为25;
TCP允许同时允许多个应用程序,每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。
端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口成为知名端口,端口号范围为0~1023。如FTP、HTTP、Telnet、SNMP服务均使用知名端口。
动态端口号范围从1024~65535,这些端口号一般不固定分配给某个服务,也就是所许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
三、TCP头部
- TCP通常使用IP作为网络层协议,这时TCP数据段被封装在IP数据包内。
- TCP数据段由TCP Header(头部)和TCP Data(数据)组成。
- TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。
- 常用字段
- 16位源端口号:源主机的应用程序使用的端口号。
- 16位目的端口号:目的主机的应用程序使用的端口号。每个TCP头部都包含源和目的端的端口号,这两个值加上IP头部中的源IP地址和目的IP地址可以唯一确定一个TCP连接。
- 32位序列号:用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。
- 32位确认序列号:用于标识接收端确认收到的数据段。确认序列号为成功收到的数据序列号加1。
- 4位头部长度:表示头部占32bit字的数目,它能表达的TCP头部最大长度为60字节。
- 16位窗口大小:表示接收端期望通过单次确认而收到的数据的大小。由于该字段为16位,所以窗口大小的最大值为65535字节,该机制通常用来进行流量控制。
- 16位校验和:校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。
- TCP三次握手
TCP是一种可靠的,面向连接的全双工传输层协议;
- 首先客户端发送了一个标识了SYN的数据段,表示想与服务器建立连接,次数据段的序列号(seq)为a。
- 服务器收到后回复了一个标识了SYN+ACK的数据段,此数据段的系列号(seq)为b,确认序列号为主机的序列号+1(a+1),以此作为主机的SYN报文的确认。
- 主机发送了一个表识ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器的序列号加1(b+1),以此作为服务器的SYN报文的确认。
精简版:
- 客户端向服务器发送了一个标识了SYN的数据段,序列号为a。
- 服务器回应SYN+ACK,序列号为b,确认序列号为客户端序列号加1(a+1)
- 主机收到服务器的SYN回应一个标识ACK的数据段,此序列号为a+1,确认序列号为服务器的序列号加1(b+1)
- TCP三次握手
TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据前,TCO通过三次握手建立的实际上是两个方向的链接,因此在传输完毕后,两个方向的连接都必须都关闭。因此需要四次握手。
- 主机终止连接,发送了一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。
- 服务器回应一个标识了ACK的数据段,序列号为b,确认序列号为主机的序列号a+1,作为主机的FIN报文做确认。
- 服务器终止连接,于是向主机发送了一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1。
- 主机回应了一个标识了ACK的数据段,序列号为a+1,确认序列号为服务器的序列号加1,b+1,作为对服务器的FIN报文的确认。
- TCP流量控制
TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
- 主机向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器收到第3个数据段后,缓存区满,第四个数据段被丢弃。
- 服务器以ACK 3073响应,窗口大小为3072,表明服务区的缓冲区只能处理3072字节的数据段。于是主机改变其发送速率,发送窗口大小为3072的数据段。
- UDP
UDP是一种面向无连接的传输层协议,传输可靠性没有保证
- 当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。
- UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。
- UDP头部
- UDP报文分为UDP报文头和UDP数据区域两部分。
- 报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。
- 相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。
- UDP头部标识
- 16位源端口号:源主机的应用程序使用的端口号。
- 16位目的端口号:目的主机的应用程序使用的端口号。
- 16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的最小值为8。
- 16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。
- UDP传输过程
- 使用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。
- 在发送数据时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网络路径到达目的主机。这样的情况下,先发送的数据包不一定先到达目的主机。因为UDP数据包没有序列号,目的主机无法通过UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认、排序和流量控制功能。
- 通常情况下,UDP采用实时传输机制和时间戳来传输语音和视屏数据。
- UDP和TCP的优势
- TCP协议传输数据时,如果一个数据段丢失或者接收端对某个数据段没有确认,发送端会重新发送该数据段。
- TCP重新发送数据会带来传输延迟和重复数据,降低了用户的体验。对于时延敏感的应用,少量的数据丢失一般可以被忽略,这时使用UDP传输将能够提升用户的体验。
- UDP不提供重传机制,占用资源小,处理效率高。
- 一些时延敏感的流量,如语音、视频等,通常使用UDP作为传输层协议。