TCP 和 UDP 协议简介
一、TCP
TCP(Transmission Control Protocol),传输控制协议,对“传输、发送、通信”进行“控制”的协议,它充分地实现了数据传输时的各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。此外,TCP 是面向有连接的协议,只有在确认通信端存在时才会发送数据。
TCP 复杂控制连接的建立、断开、保持等管理工作,保证了在 IP 这种无连接的网络上也能够实现高可靠性的通信。
1. 数据发送
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ACK)。如果在一定时间内没有收到 ACK,发送端就可以认为数据已经丢失,并进行重发。
在 TCP 中,会在发送数据的每一个字节都标上序号,接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序号作为 ACK 返送回去。序列号机制使发送端可以根据序列号分批次发送,使接收端可以处理消息乱序和重复问题。
在 TCP 中,会在每次发包时计算往返时间及其偏差(方差),将这个往返时间和偏差(方差)相加就是 重发超时时间。当然,最初的数据包还不知道往返时间,其重发超时一般设置为 6 秒左右。若数据被重发之后还是收不到 ACK,则进行再次发送,此时,重发超时时间会以 2 倍、4 倍的指数函数延长。
当数据达到一定的重发次数之后,如果仍没有任何 ACK 返回,就会判断为网络或对端主机发生了异常,强制关闭连接。
2. 连接管理
TCP 连接过程就是我们再熟悉不过的三次握手和四次挥手过程。

3. 段和窗口控制
TCP 以段(Segment)为单位发送数据,段的大小(MSS:Maximum Segment Size)是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小,然后 TCP 会在两者之间选择一个较小的值投入使用。
TCP 以段为单位,每发一个段进行一次 ACK 的处理,这样的传输方式有一个缺点 —— 包的往返时间越长通信性能就越低。为解决这个问题,TCP 引入了 窗口 这个概念,窗口是比段更大的单位,在窗口内发送了一个段以后不必要一直等待 ACK,而是继续发送。如下图,窗口大小为 4 个段。

在使用窗口控制中,如果出现段丢失该怎么办?这个问题可以分为两种情况,第一种情况是接收端接收到了数据,但是回复 ACK 失败,这种情况是不需要再进行重发的,接收端会在下一次的 ACK 中告知数据接收成功了;第二种情况是接收端未收到数据,接收端会一直 ACK 该数据的序列号,当发送端连续 3 次接收同一序列号的 ACK,就会将其对应的数据进行重发,该机制称为 高效重发机制。

4. 流控制
流控制体现为可以让发送端根据接收端的实际接收能力控制发送的数据量。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据,该大小限度就被称为窗口大小。
接收端的数据缓冲区一旦面临溢出时,窗口大小的值也会被随之设置为一个更小的值通知给发送端。发送端再根据该值,对发送数据的量进行控制。这就形成了一个完整的 TCP 流控制。
5. 拥塞控制
拥塞控制是为了解决网络拥堵的问题,在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。前面提到的流控制,窗口大小是由接收端决定的,发送端无法自我调节要发送的数据量。
为了在发送端调节所要发送数据的量,定义了一个叫做 拥塞窗口 的概念。在通信一开始时,通过一个叫做慢启动的算法计算出拥塞窗口的初始阈值,之后每收到一次 ACK,拥塞窗口按照一定的比例放大拥塞窗口。在发送数据包时,将拥塞窗口的大小与接收端主动通知的窗口大小做比较,然后按照它们当中较小的那个值,发送比其还要小的数据量。
当 TCP 通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生(体现为数据重发)吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程。因此所谓 TCP 的吞吐量的特点就好像是在逐步占领网络带宽的感觉。

6. Nagle 算法
Nagle 算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说,就是仅在下列任意一种条件下才能发送数据。
- 已发送的数据都已经收到 ACK
- 已发送最大段长度(MSS)的数据
7. 延迟确认应答
前面提到,TCP 采用滑动窗口的控制机制,因此通常确认应答少一些也无妨。为此,引入了一个方法,那就是收到数据以后并不立即返回 ACK,而是延迟一段时间的机制。
- 在没有收到 2x最大段长度(MSS)的数据为止不做 ACK,体现为每两个数据段返回一个 ACK。
- 其他情况下,最大延迟 0.5s 发送 ACK(很多操作系统设置为 0.2s 左右)
二、UDP
UDP(User Datagram Protocol),用户数据报协议,不提供复杂的控制协议,利用 IP 提供面向无连接的通信服务。即使是出现网络拥堵的情况下,UDP 也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即使出现丢包,UDP 也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交由采用 UDP 的应用程序去处理。
UDP 是一种没有复杂控制,提供面向无连接通信服务的一种协议。换句话说,它将部分控制转移给应用程序去处理,自己却只提供作为传输层协议的最基本功能,本身处理既简单又高效,因此经常用于以下几个方面:
- 包总量较少的通信(DNS、SNMP 等)
- 视频、音频等多媒体通信(即时通信)
- 限定于 LAN 等特定网络中的应用通信
- 广播通信(广播、多播)
三、总结
TCP 是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP 能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外,TCP 还能够有效利用带宽,缓解网络拥堵。然而,为了建立与断开连接,有时它需要至少 7 次的发包丢包,导致网络流量的浪费。此外,为了提高网络的利用率,TCP 协议中定义了各种各样复杂的规范,因此不利于视频会议(音频、视频的数据量既定)等场合使用。
UDP 有别于 TCP,它是一种面向无连接的传输层协议。UDP 不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP 常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。
TCP 和 UDP 协议简介的更多相关文章
- 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议
软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...
- TCP与UDP协议
传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...
- TCP和UDP协议的比较
通信协议 网络通信是两台计算机上的两个进程之间的通信. 网络通信需要通信协议.网络协议有很多种,就像我们平常交流说话,也有多种语言.. 最常见的协议是TCP/IP协议.UDP协议. TCP:TCP 是 ...
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- TCP 和 UDP 协议
TCP 和 UDP 协议 一.socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...
- 运输层协议--TCP及UDP协议
TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...
- TCP和UDP 协议发送数据包的大小
在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...
- TCP/IP/UDP 协议
互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
随机推荐
- redux & dispatch & payload
redux & dispatch & payload react & react-redux & redux-saga // contrast dispatch({ t ...
- ts 函数重载
class User { constructor(public readonly name: string, public readonly value: Function) {} } class D ...
- ffmpeg concat设置绝对路径
https://superuser.com/questions/718027/ffmpeg-concat-doesnt-work-with-absolute-path/1551017#1551017 ...
- 使用 Tye 辅助开发 k8s 应用竟如此简单(三)
续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中如何对数据库进行链接. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首次 ...
- 初学c++,vc++6.0必备!
文章首发 | 公众号:lunvey 作为一个纯粹的萌新,工作需要,刚接触到c++. 按照以往的经验,配置一个开发环境是首要的,其次便是边学边敲. c++入门书籍寻找了一堆,发现了一个共同点,在Wind ...
- SSL/TLS协议详解(中)——证书颁发机构
本文转载自SSL/TLS协议详解(中)--证书颁发机构 导语 上一篇中,我们讨论了关于Diffie Hellman算法的SSL/TLS密钥交换.我们最终认为需要第三方来验证服务器的真实性,并提出了证书 ...
- Java8 关于stream.foreach()和stream.peek()的区别解析
该思考来源于日常工作中,特记此心得. 思考:如何快速将list中的每个item内部属性值改变并进行其他流体操作呢? 下面做个测试:如何先在list中统一改变某属性的值,然后再根据某个属性取出该属性值最 ...
- 使用createrepo构建本地yum仓库
rpm包安装的时候会有很多软件会出现因为其他依赖包没有,而导致安装失败的情况.一般可以连接外网的时候我们直接使用 yum 进行安装,可以为我们解决依赖包关系,但是很多工作环境下是没有外网的,内网情况下 ...
- 漏洞复现-CVE-2018-8715-Appweb
0x00 实验环境 攻击机:Win 10 0x01 影响版本 嵌入式HTTP Web服务器,<7.0.3版本 0x02 漏洞复现 (1)实验环境: 打开后出现此弹框登录界面: (2) ...
- ClickHouse元数据异常-MySQLHandlerFactory:Failed to read RSA key pair from server
Clickhouse版本:20.3.6.40-2 clickhouse集群三个节点,一分片,三副本,三个节点数据完全一样 1. 问题描述 在使用连接工具操作时,发现其中一个节点连接拒绝,无法操作,另外 ...