[计算机网络读书笔记]TCP和UDP
一 传输层协议概述
- 严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付给主机中的应用进程。
- 从传输层的角度看,通信的真正端点并不是主机而是主机中的进程。
- 在一个主机中经常有多个应用进程同时分别和另一个主机中的多个应用进程通信。因此运输层有一个很重要的功能,复用和分发。复用指发送方不同的应用进程都可以使用同一个运输层协议传送数据(当然需要加上适当的首部),分发指接收方的运输层在剥去报文的首部后能够把这些数据正确的交付到目的应用进程。注,IP层也有复用和分用功能,在发送方不同协议的数据都可以封装成IP数据报发送出去,而在接收方的IP层,根据IP首部中的协议字段进行分用,把剥去首部后的数据交付给应当接收这些数据的协议。
- 运输层还要对收到的报文进行差错检测。在网络层,IP数据报首部中的检验和字段,只检验首部是否出现差错而不检查数据部分。
- 根据应用进程的不同需求,运输层需要两种不同的运输协议,面向连接的TCP和无连接的UDP。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。
二 使用UDP和TCP协议的各种应用和应用层协议

三 运输层的端口
- 为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法(而这种方法必须与特定操作系统无关)对TCP、IP体系的应用进程标志。
- 运输层使用协议端口号,虽然通信的终点是应用进程,但我们只要把要传送的报文交到目的主机的而某一个合适的目的端口,剩下的工作(即最后交付给目的进程)就由TCP来完成。
- TCP/IP的运输层用一个16位端口号来标志一个端口。单端口号只具有本地一一,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在因特网不同计算机中,相同的端口号是没有关联的。16位的断案口号可允许有65535个不同的端口号,这个数目对一个计算机来说是足够用的。
- 由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的IP地址(找计算机),还要知道对方的端口号(找进程)。
- 运输层端口号分为两类。
- 服务器端口号。又分为系统端口号,数值为0 ~ 1023。另一类为登记端口号,数值为1024 ~ 49151

- 客户端端口号。数值为1024 ~ 49151。这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。
四 UDP协议概述
- 用户数据报协议UDP(User Datagram Protocol)
- UDP只在IP的数据服务之上增加了复用分用功能以及差错检测功能。
- UDP的主要特点
- 无连接的。不需要建立连接释放连接,减少了开销和发送数据之前的时延。
- 尽最大努力交付。
- 面向报文的。对应用程序交下来的报文,不合并也不拆分。在添加首部后就向下交付给IP层。即UDP一次交付一个完整的报文。因此应用程序应选择合适大小的报文。若报文太长,IP层在传送时可能要进行分片,这会降低IP层的效率。若报文太短,会使IP数据报的首部的相对长度太大,这也降低了IP层效率。
- 没有拥塞控制。因此网络出现拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多实时应用(如IP电话,实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但不允许数据有太大的时延。UDP正好适合这种要求。
- 支持一对一,一对多,多对一和多对多的交互通信。
- 首部开销小。只有8个字节。
- 还有一些使用UDP的实时应用,需要对UDP的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采取前向纠错或重传已丢失的报文。
五 UDP的首部格式
- 用户数据报UDP有两个字段:数据字段和首部字段。
- 首部字段很简单,只有8个字节,有四个字段组成:
- 源端口
- 目的端口
- 长度 UDP用户数据报的长度,其最小值是8(仅有首部)。
- 校验和
六 TCP协议概述
- 传输控制协议TCP(Transmission Control Protocol)
- TCP主要特点
- 面向连接的运输层协议。应用程序是使用TCP协议前,必须要建立TCP连接,数据传输完毕后,必须释放已建立的TCP连接。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。
- TCP提供可靠交付的服务。TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
- TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用进程在把数据传送给TCP缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
- 面向字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付给了上层的应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力是被收到的字节流,把它还原成有意义的应用层数据。
总结
- UDP:无连接,尽最大努力交付的,面向报文的,首部开销小8字节,没有拥塞控制的,支持一对一,一对多,多对一和多对多的通信
- TCP:面向连接的,可靠的,面向字节流的,首部开销大的20字节,有拥塞控制的,支持一对一的全双工通信。