图解TCP/IP:TCP与UDP

传输层的作用

TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

两种传输层协议TCP和UDP

TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制,此外还具有“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。

UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。

TCP与UDP区分

  • TCP用于在传输层有必要实现可靠传输的情况

  • UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。此外,在多播与广播通信中也使用UDP而不是TCP,RIP、DHCP等基于广播的协议也要依赖于UDP。

# 套接字

应用程序利用套接字(socket),可以设置对端的IP地址、端口号,并实现数据的发送与接收。

端口号

端口号定义

端口号用来识别同一台计算机中进行通信的不同应用程序。

通过IP地址、端口号、协议进行通信识别
# 识别多个请求

通过源IP地址、目标IP地址、协议号、源端口号和目标端口号这5个数字识别一个通信。
端口号如何确定

确定端口号的方法分为两种:

  • 标准既定的端口号:也叫静态方法,是指每个应用程序都有其指定的端口号,每个端口号都有其对应的使用目的。知名端口号一般由0~1023的数字分配而成,还有一些端口号也被正式注册,它们分布在1024~49151的数字之间。

  • 时序分配法:也叫动态分配法,服务端有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。动态分配的端口号取值范围在49152~65535之间。

# TCP具有代表性的知名端口号
21 ftp  |  22 ssh  |  23 telnet  |  25 stmp  |  80 http
110 pop3  |  220 Imaps  |  443 https

# UDP具有代表性的知名端口号
53 domain  |  67 bootps  |  68 bootpc  |  161 snmp  |  520 router
端口号与协议

端口号由其使用的传输层协议决定,端口号上的处理是根据每个传输协议的不同而进行的。

UDP

UDP是User Datagram Protocol的缩写。UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务,并且它是将应用程序发来的数据在收到的那一刻立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥堵的行为。此外,传输途中即使出现丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交由采用UDP的应用程序去处理。UDP按照“制作程序的那些用户的指示行事”。

由于UDP面向无连接可以随时发送数据,而且UDP本身的处理既简单又高效,因此经常用于以下几个方面:

  • 包总量较少的通信(DNS、SNMP等)

  • 视频、音频等多媒体通信(即时通信)

  • 限定于LAN等特定网络中的应用通信

  • 广播通信(广播、多播)

TCP

TCP是对“传输、发送、通信”进行“控制”的“协议”,充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。

连接是指各种设备、线路,或网络中进行通信的两个应用程序为了相互传递消息而专有的、虚拟的通信线路,也叫做虚拟电路。应用程序可以不同顾虑提供尽职服务的IP网络上可能发生的各种问题,依然可以转发数据。TCP则负责控制连接的建立、断开、保持等管理工作。

# 连接

当连接建立好以后进行通信时,应用程序只需要通过管道的出入口发送或接受数据,就可以实现与对端的网络通信。
TCP的特点及其目的

TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

通过序列号与确认应答提高可靠性

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ACK)。

# 正常的数据传输

当数据从主机A到主机B时,主机B会返回给主机A一个确认应答。
# 数据包丢失的情况

当数据由主机A发出后如果因网络拥堵等原因丢失的话,该数据将无法到达主机B。
此时,如果主机A在一个特定时间间隔内都未收到主机B发来的确认应答,将会对此数据进行重发。

未收到确认应答并不意味着数据一定丢失。

# 确认应答丢失的情况

由主机B返回的确认应答,因网络拥堵等原因在传送的途中丢失,没有到达主机A。
主机A会等待一段时间,若在特定的时间间隔内始终未能收到这个确认应答,主机A会对此数据进行重发。
此时,主机B将第二次发送已接收此数据的确认应答。
由于主机B其实已经接收过1~1000的数据,当再有相同数据送达时它会放弃。

序列号是按顺序给发送数据的每一个字节都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。

序列号的初始值并非为0,而是在建立连接以后由随机数生成,后面的计算则是对每一字节加一。

# 发送数据

发送的数据:


序列号与确认应答号:



重发超时如何确定

重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。最理想的是,找到一个最小时间,它能保证“确认应答一定能在这个时间内返回”。

TCP要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。根据网络环节的不同往返时间可能会产生大幅度的摇摆,之所以发生这样情况是因为数据包的分段是经过不同线路到达的。

# 往返时间的计算与重发超时的时间推移





在BSD的Unix以及Windows系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。

  • 不过由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。

  • 数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。

  • 数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接,并通知应用通信异常强行终止。

连接管理

面向有连接是指在数据开始之前先做好通信两端之间的准备工作。

可以使用TCP首部用于控制的字段来管理TCP连接。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成。

# TCP连接的建立与断开






TCP以段为单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,也可以称其为最大消息长度(Maximum Segment Size, MSS)。最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。TCP在传送大量数据时,是以MSS的大小将数据进行分割发送,进行重发时也是以MSS为单位。

MSS是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS大小,然后会在两者之间选择一个较小的值投入使用。

# 接入以太网主机与接入FDDI主机之间通信的情况

通过建立连接的SYN包相互通知对方网络接口的MSS值。
在两者之间选一个较小的作为MSS的值,发送数据。

为附加MSS选项,TCP首部将不再是20字节,而是4字节的整数倍。
利用窗口控制提高速度

TCP以1个段为单位,每发一个段进行一次确认应答的处理。

# 按数据包进行确认应答

为每个数据包进行确认应答的缺点是,包的往返时间越长,网络的吞吐量会越差。

确认应答不再以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。

# 用滑动窗口方式并行处理

根据窗口为4000字节时返回的确认应答,下一步就发送比这个值还要大4000个序列号为止的数据。
这跟前面每个端接收确认应答以后再发送另一个新段的情况相比,即使往返时间变长也不会影响网络的吞吐量。

窗口大小是指无需等待确认应答而可以继续发送数据的最大值。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。在滑动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。

收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置,这样可以顺序地将多个段同时发送提高通信性能,这种机制也被称为滑动窗口控制

# 滑动窗口方式

在①的状态下,如果收到一个请求序列号为2001的确认应答,那么2001之前的数据就没有必要进行重发。
这部分的数据可以被过滤掉,滑动窗口成为③的样子。

这是在1个段为1000个字节、窗口为4个段的情况
窗口控制与重发控制
# 没有确认应答也不受影响

窗口在一定程度上较大时,即使有少部分的确认应答丢失也不会进行数据重发。
可以通过下一个确认应答进行确认。

在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回,而发送端主机如果连续3次收到同一个确认应答,就会将其所对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制

# 高速重发控制(Fast Retransmission)

接收端在没有收到自己所期望序号的数据时,会对之前收到的数据进行确认应答。
发送端则一旦收到某个确认应答后,又连续3次收到同样的确认应答,则认为数据段已经丢失,需要进行重发。
这种机制比起超时机制可以提高更为快速的重发服务。
流控制

TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据,该大小限度就被称作窗口大小。

TCP首部中专门有一个字段用来通知窗口大小,接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端,这个字段的值越大,说明网络的吞吐量越高。不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。

# 流控制

过了重发超时的时间以后若还没有收到窗口更新的通知,发送端会发送一个窗口探测的包。
一旦这个通知在传送途中丢失,会导致无法继续通信,因此发送端主机时不时就会发送窗口探测包。

发送端主机根据接收端主机的窗口大小通过进行流量控制。
由此也可以防止发送端主机一次发送过大数据导致接收端主机无法处理的情况发生。
拥塞控制

一般来说,计算机网络都处在一个共享的环境,因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然一个较大量的数据,极有可能会导致整个网络的瘫痪。

TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。

# 慢启动

最初将发送端的窗口(拥塞窗口)设置为1。每收到一个确认应答,窗口的值会增加一个段。

首先,为了在发送端调节所要发送数据的量,定义了一个叫做拥塞窗口的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(MSS)发送给数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小那个值,发送比其还要小的数据量。如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。有了这些机制,就可以有效地减少通信开始时连续发包导致的网络拥堵,还可以避免网络拥塞情况的发生。

具体来说,MSS的值小于1095字节时最大为4MSS,小于2190字节时最大为3MSS,超过2190字节时最大值为2MSS。
以太网的标准MSS值为1460字节,因此慢启动的初始值从4380字节(3MSS)开始就可以。

不过,随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阈值的概念。只要拥堵窗口的值超出这个阈值,在每收到一次确认应答时,只允许以下面这种比例放大拥塞窗口:1个数据段的字节数/拥塞窗口(字节) * 1个数据段字节数

# TCP的窗口变化






TCP的通信开始时,并没有设置相应的慢启动阈值,而是在超时重发时,才会设置为当时拥塞窗口一半的大小。而由重复确认应答进行高速重发控制时,慢启动阈值的大小被设置为当时窗口大小的一半,然后将窗口的大小设置为该慢启动阈值+3个数据段的大小。

提高网络利用率的规范
Nagle算法

Nagle算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说,就是仅在下列任意一种条件下才能发送数据。如果两个条件都不满足,那么暂时等待一段时间以后再进行数据发送。

  • 已发送的数据都已经收到确认应答时

  • 可以发送最大段长度(MSS)的数据时

根据这个算法虽然网络利用率可以提高,但是可能会发生某种程度的延迟。为此,在窗口系统以及机械控制等领域中使用TCP时,往往会关闭对该算法的启用。

延迟确认应答

接受数据的主机如果每次都立刻回复确认应答的话,可能会返回一个较小的窗口,那是因为刚接受完数据,缓冲区已满。当某个接收端收到这个小窗口的通知以后,会以它为上限发送数据,从而又降低了网络的利用率。为此,引入了一个方法,那就是收到数据以后并不立即返回确认应答,而是延迟一段时间的机制。

  • 在没有收到2*最大段长度的数据为止不做确认应答

  • 其他情况下,最大延迟0.5秒发送确认应答

事实上,大可不必为每一个数据段都进行一次确认应答。TCP采用滑动窗口的控制机制,因此通常确认应答少一些也无妨。TCP文件传输中,绝大多数是每两个数据段返回一次确认应答。

# 延迟确认应答

每收到两个数据段发送一次的确认应答。不过,等待0.2秒以后没有其他数据包到达的情况下才会发送确认应答。
捎带应答

根据应用层协议,发送出去的消息到达对端,对端进行处理以后,会返回一个回执。在此类通信当中,TCP的确认应答和回执数据可以通过一个包发送,这种方式叫做捎带应答(PiggyBack Acknowledgment)。通过这种机制,可以使收发的数据量减少。

如果没有启用延迟确认应答就无法实现捎带应答。延迟确认应答是能够提高网络利用率从而降低计算机处理负荷的一种较优的处理机制。

# 捎带应答

捎带应答是指同一个TCP包中既发送数据又发送确认应答的一种机制。
由此,网络的利用率会提高,计算机的负荷也会减轻。
不过,确认应答必须得等到应用处理完数据并将作为回执的数据返回为止,才能进行捎带应答。
使用TCP的应用

如果需要应用自己处理一些更为细节上的控制,使用UDP协议是不错的选择。如果转发量较多、对可靠性的要求比较高时,可以选择使用TCP。

(最近更新:2019年09月18日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值