TCP和UDP

318 阅读9分钟

TCP与UDP的区别

  • TCP面向连接的,可靠的数据传输服务;UDP面向无连接的,尽最大努力的数据传输服务,不保证数据传输的可靠性
  • TCP面向字节流,UDP面向报文
  • 应用进程交给 UDP 多长的报文, UDP 就照样发送,一次发送一个报文;TCP 在发送时采取的方式完全不同:TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应该包含多少个字节。如果报文太长,TCP会将其拆分再发送,如果报文太短,TCP会等待积累足够多的字节后再构成报文段发送出去
  • TCP数据传输慢,UDP数据传输快
  • TCP有拥塞控制,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有效,如直播,实时视频会议等)
  • TCP 只能是一对一的通信(TCP连接的端点是套接字socket),而 UDP 支持一对一、一对多、多对一和多对多的通信
  • TCP 的首部开销大,有 20 个字节,比 UDP 的 8 个字节的首部要长。
  • TCP提供可靠全双功的通信服务。UDP是半双功,只能单向传播。

【注意】

TCP面向字节流中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

另外TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;套接字 socket = (IP地址:端口号)TCP 连接定义为 {socket1, socket2} = { (IP1: port1), (IP2: port2) }

TCP与UDP的适用场景

TCP 适用于效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。TCP 适用于电子邮件(SMTP)、远程终端接入(TELNET)、万维网(HTTP)、文件传送(FTP)

UDP 适用于效率要求相对高,对准确性要求相对低的场景。如视频直播、QQ语音电话等即时通讯、广播通信。开销小(因为提供可靠的、面向连接的运输服务,会多很多开销比如确认、流量控制、计时器、连接管理等),也适用于简单文件传送(TFTP)、路由选择协议(RIP)、域名系统(DNS)等

TCP与UDP对应的协议

TCP对应的协议

  • FTP(21):定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。
  • ssh(22): 专为远程登录会话和其他网络服务提供安全性的协议
  • Telnet(23):(远程登陆协议)它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。
  • SMTP(25):定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。
  • POP3(110):它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。
  • HTTP(80)协议:是从Web服务器传输超文本到本地浏览器的传送协议。

UDP对应的协议

  • DNS(53):用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
  • RIP(520):路由信息协议,端口520
  • SNMP(161):简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
  • TFTP(69)(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

TCP的拥塞控制

(1)慢启动

慢启动的目的是尽快找到上限。

  • MSS:最大报文段长度,TCP双方发送的报文段中,包含的数据部分的最大字节数;
  • cwnd:拥塞窗口,TCP发送但还没有得到确认的报文的序号都在这个区间;
  • RTT:往返时间,发送方发送一个报文,到接收这个报文的确认报文所经历的时间;
  • ssthresh:慢启动阈值,慢启动阶段,若cwnd的大小达到这个值,将转换到拥塞避免模式;

慢启动是建立TCP连接后,采用的第一个调整发送速率的算法(或叫模式)。在这个阶段,cwnd通常被初始化为1MSS,这个值比较小,在这个时候,网络一般还有足够的富余,而慢启动的目的就是尽快找到上限。在慢启动阶段,发送方每接收到一个确认报文,就会将cwnd增加1MSS的大小,于是:

  • 初始cwnd=1MSS,所以可以发送一个TCP最大报文段,成功确认后,cwnd = 2MSS;
  • 此时可以发送两个TCP最大报文段,成功接收后,cwnd = 4 MSS;
  • 此时可以发送四个TCP最大报文段,成功接收后,cwnd = 8 MSS......

由于TCP是一次性将窗口内的所有报文发出,所以所有报文都到达并被确认的时间,近似的等于一个RTT(记住这个结论,后面所述的RTT都是基于这个结论)。所以在这个阶段,拥塞窗口cwnd的长度将在每个RTT后翻倍,也就是发送速率将以指数级别增长(所以不要被慢启动这个名字误导了)。那这个过程什么时候改变呢,这又分几种情况:

  • 第一种:若在慢启动的过程中,发生了数据传输超时,则此时TCP将ssthresh的值设置为cwnd / 2,然后将cwnd重新设置为1MSS,重新开始 慢启动过程,这个过程可以理解为试探上限;
  • 第二种:第一步试探出来的上限ssthresh将用在此处。若cwnd的值增加到>= ssthresh时,此时若继续使用慢启动的翻倍增长方式可能有些鲁莽,所以这个时候结束慢启动,改为拥塞避免模式;
  • 第三种:若发送方接收到了某个报文的三次冗余确认(即触发了快速重传的条件),则进入到快速恢复阶段;同时,ssthresh = cwnd / 2,毕竟发生快速重传也可以认为是发生拥塞导致的丢包,然后cwnd = ssthresh + 3MSS;    以上就是慢启动的过程,下面来介绍拥塞避免。

(2)拥塞避免

刚进入这个模式时,cwnd的大小近似的等于上次拥塞时的值的一半(这是由进入这个模式的条件决定的),也就是说当前的cwnd很接近产生拥塞的值。所以,拥塞避免是一个速率缓慢且线性增长的过程,在这个模式下,每经历一个RTT(请注意2.4中有关RTT的结论),cwnd的大小增加1MSS,也就是说,假设cwnd包含10个报文的大小,则每接收到一个确认报文,cwnd增加1/10 MSS。这个线性增长的过程什么时候结束,分为两种情况:

  • 第一种:在这个过程中,发生了超时,则表示网络拥塞,这时候,ssthresh被修改为cwnd / 2,然后cwnd被置为1MSS,并进入慢启动阶段;
  • 第二种:若发送方接收到了某个报文的三次冗余确认(即触发了快速重传的条件),此时也认为发生了拥塞,则,ssthresh 被修改为 cwnd/2,然后cwnd被置为ssthresh + 3MSS,并进入快速恢复模式;    我们可以看到,慢启动和拥塞避免在接收到三个冗余的确认报文时,处理方式是一样的:判断发生了拥塞,并减小ssthresh的大小,但是cwnd的大小却不见得有减小多少,这一点让人疑惑。我个人认为是这样,虽然发送方通过接收三次冗余确认报文,判断可能存在拥塞,但是既然可以收到冗余的确认报文,表示拥塞不会太严重,甚至已经不再拥塞,所以对cwnd的减小不是这么剧烈。

(3)快速恢复

快速恢复和上面两种模式不太一样,这种模式在TCP规范中并没有强制要求实现,只是一种推荐实现的模式。在快速恢复阶段,每接收到一个冗余的确认报文,cwnd就增加1MSS,其余不变,而当发生以下两种情况时,将退出快速恢复模式:

  • 第一种:在快速恢复过程中,计时器超时,这时候,ssthresh被修改为 cwnd / 2,然后cwnd被置为1MSS,并进入慢启动阶段;
  • 第二种:若发送方接收到一条新的确认报文(不是冗余确认),则cwnd被置为ssthresh,然后进入到拥塞避免模式;

进入到此模式的条件就是接收到三次冗余的确认报文,判断报文丢失,那为什么再次接收到冗余确认报文时,cwnd还是要增长呢?

答:此时再次收到一条冗余的确认报文,表示发送端发出的报文又有一条离开网络到达了接收端(虽然不是接收端当前想要的一条),这说明网络中腾出了一条报文的空间,所以允许发送端再向网络中发送一条报文。但是由于当前序号最小的报文丢失,导致拥塞窗口cwnd无法向前移动,于是只好将cwnd增加1MSS,于是发送端又可以发送一条数据段,提高了网络的利用率。

参考链接:

www.zhihu.com/question/47… www.cnblogs.com/tuyang1129/…