第六章 TCP与UDP

1. 传输层的作用

  1. 传输层定义
    IP会使得数据包到达目的地,但是具体这个数据包是给哪个应用程序就需要TCP等利用端口来识别了。
  2. 通信处理
    服务端的程序需要提前启动,准备接受客户端的请求
    这些服务端的程序叫做守护进程。
    比如http的服务端程序是httpd,而ssh的服务端程序叫sshd
    UNIX中不需要把这些守护进程逐一打开,而是启动一个inetd(互联网守护进程)的服务程序就行,这个程序是超级守护进程。其收到客户端请求以后就会fork新的进程并转换为各种守护进程(httpd、sshd等)
  3. 两种传输层协议TCP和UDP
  • TCP:是面向连接的、可靠的流协议(流是指不间断的数据结构)。TCP提供可靠性传输,实行“顺序控制”或“重发控制”机制。
  • UDP:不具有可靠性的数据报协议。虽然可以确保发送消息的大小,但是不能保证消息一定会到达。
  1. TCP和UDP的区分
    TCP用于需要实现可靠传输的情况
    但是在电视会议、打电话等情况下,由于TCP的重发机制,会导致丢失的数据报重新发出,却会影响通信效果。而UDP却不会重发,即使有丢包,对通信影响其实不大。
  2. socket(套接字)
    使用TCP或UDP通信时,会广泛地使用socket的API。应用程序利用socket可以设置对端的IP地址、端口号,并实现数据的发送和接收。

2. 端口号

  1. 端口号定义
    MAC地址用来识别同一个链路中不同的计算机。
    IP地址用来识别在TCP/IP网络中互连的主机和路由器。
    端口号用来识别同一台计算机中进行通信的不同应用程序。

  2. 根据端口号识别应用
    一个计算机有多个应用程序,传输层协议正是利用端口号识别本机中正在进行通信的应用程序

  3. 通过IP地址、端口号、协议号进行通信识别
    仅仅凭借目标端口来识别某一通信是不够的。
    比如开了俩浏览器,端口号是一样的。
    因此TCP/IP或UDP/IP通信中一般用5个信息来识别一个通信。它们是“源IP地址”、“目标IP地址”、“协议号”、“源端口号、“目标端口号”。只要其中有不一样的就会被认为是其他通信。

  4. 端口号如何确定
    实际通信时,端口号需要事先确定。确定端口号的方法有两种:

  • 标准既定的端口号
    也叫静态方法。每个应用程序都有其指定的端口号。每个端口号都有其对应的使用目的。
    比如http、FTP等广为使用的应用协议中使用的端口号就是固定的。这些端口号也叫知名端口号。
    除了知名端口号,还有一些端口号也被正式注册,分布在1024到49151之间。
  • 时序分配法
    客户端应用程序完全不需要自己设置端口号,而是全权交给操作系统来分配。OS会分配不冲突的端口号。
    这时候只需要服务端监听端口号就行,客户端没必要确定端口号。
  1. 端口号和协议
    端口号由其使用的传输层协议决定。不同的传输协议可以使用相同的端口号。
    数据到达IP层之后会检查其首部的协议号,如果是TCP就会传给TCP模块,如果是UDP就会传 给UDP模块去做端口号处理。因此即使是同一个端口号,由于传输协议是各自独立进行处理,因此相互之间不会受到影响。

3. UDP

  1. UDP的特点及其目的
    UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。
    UDP只提供传输层最基本的功能,是面向无连接的协议。如果需要什么细节控制,就基本只能交给采用UDP的应用程序去处理。UDP就是用户说什么就听什么。
    因此经常用在以下几个方面:
  • 包总量较少的通信(DNS, SNMP等)
  • 视频、音频等多媒体通信(即时通信)
  • 限定于LAN等特定网络中的应用通信
  • 广播通信(广播、多播)

4. TCP

  1. TCP的特点及其目的
    TCP通过IP数据报实现可靠性传输,需要考虑很多东西。

  2. 通过序列号与确认应答提高可靠性
    TCP中,如果发送端的数据到达接收主机之后,接收主机会返回已收到消息的通知,这个消息叫确认应答(ACK)。
    TCP通过ACK实现可靠的传输。如果一定时间都没有等到ACK应答,就会视作发送失败,然后重发。收到ACK就会发送回去。
    当然有时候也会出现ACK丢了的情况。这样发送端就会重复发送数据,接收端通过判断发现是相同数据就会不接收。而需要发现这是相同数据就需要一种机制:序列号。
    序列号是按照顺序给发送数据的每一个字节都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,把自己下一步应该接收的序号作为确认应答发送回去。

  3. 重发超时如何确认
    最理想的情况是找到最小时间,但是这个时间是会变化的。
    因此每次发包都会计算往返时间和偏差,将这个往返时间和偏差相加,重发超时的时间就是比这个和稍大的值。
    数据重发还是收不到ACK就会将重发时间以2倍、4倍的指数函数延长。
    也不会一直重发下去,当重发次数达到一定值以后,如果仍然没有任何响应,就判断是对端主机发生了异常,强制关闭了链接。并且通知应用通信异常强行终止了。

  4. 链接管理
    TCP是面向连接的通信传输。即在开始通信之前,先建立连接,否则不通信。
    在通信前,会先发一个SYN包作为建立连接的请求等待确认应答。如果收到ACK就认为连接建立,否则就不会进行数据通信。此外,通信结束的时候会进行断开连接的处理(FIN包)。

  5. TCP以段为单位发送数据
    建立连接的同时需要确定发送数据包的单位(最大消息长度:MSS)。
    最理想的情况是MSS正好是IP中不会被分片处理的最大数据长度。
    两端主机在建立连接的请求时,会将自己接口能适应的MSS写在MSS选项中。 最后选取双方MSS中较小的作为最终的MSS。

  6. 利用窗口进行控制
    一次以一个段作为单位发送的话通信性能会很低。
    利用窗口可以解决这个问题。即确认应答不是以每个分段而是以更大的单位进行确认,转发时间就会大幅缩短。
    也就是发送端主机在发送一个段之后不必要一直等待确认应答,而是继续发送。
    窗口大小就是无需等待ACK而可以继续发送数据的最大值。
    如果出现丢包发送端还要负责重传,因此需要缓冲区保留这些待重传的数据。
    如果如期收到ACK那么这些缓冲区中的数据就可以删除了。
    收到ACK的情况下,就把窗口滑到ACK中序列号的位置(这种机制叫滑动窗口控制)

  7. 窗口控制
    如果出现段丢失怎么办?
    情况1:ACK没能返回。这样数据已经到了,是不需要进行重发的。因此某些ACK即使丢失也无需重发。
    情况2:报文丢失。在窗口比较大又出现报文丢失的时候,同一个序号的ACK就会被重复不断地返回。发送端主机如果连续接受到3次同样的ACK就会将对应的数据重发。这也叫作高速重发控制。

  8. 流控制
    TCP提供了一种机制可以让发送端根据接受端的实际接收能力控制发送的数据量。这就是流控制。
    对窗口设置大小限制,这就是窗口大小。
    比如接收端缓冲区满了,就要停止接受数据。这时候发送端主机会时不时法案搜索那个一个叫做窗口探测的数据段,仅仅含有一个字节来获取最新的窗口大小消息。

  9. 拥塞控制
    有时候会发送大量的数据包,造成网络拥塞。
    TCP为了防止该问题会在通信一开始的时候加一个叫做慢启动的算法得出的数值,对发送的数据量进行控制。一开就把窗口设为1MSS。之后每收到ACK就将拥塞窗口的值加1。

  10. 提高网络利用率的规范

  • Nagle算法
    如果数据很少,就延迟发送。如果以下两个条件不满足,就等待一段时间后进行数据发送:
    (1)已发送的数据都已经收到ACK
    (2)可以发送MSS的数据
  • 延迟确认应答
    刚刚接收完数据,缓冲区已经满了,所以立刻返回ACK可能返回一个较小的窗口。
    因此引入方法收到数据后不立即返回ACK
  • 捎带应答
    TCP的ACK和回执数据(比如邮件等)可以通过一个包发送
  1. 使用TCP的应用
    需要考虑下是全权交给TCP还是自己进行细微的控制

5 UDP首部的格式

  • 源端口号
  • 目标端口号
  • 包长度
  • 校验和

6 TCP首部格式

比UDP首部复杂很多

  • 源端口号
  • 目标端口号
  • 序列号
  • 确认应答号
  • 数据偏移
  • 保留
  • 控制位
  • 窗口大小
  • 校验和
  • 紧急指针
  • 选项

你可能感兴趣的:(第六章 TCP与UDP)