一、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 协议简介的更多相关文章

  1. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  2. TCP与UDP协议

    传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...

  3. TCP和UDP协议的比较

    通信协议 网络通信是两台计算机上的两个进程之间的通信. 网络通信需要通信协议.网络协议有很多种,就像我们平常交流说话,也有多种语言.. 最常见的协议是TCP/IP协议.UDP协议. TCP:TCP 是 ...

  4. 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  5. TCP 和 UDP 协议

    TCP 和 UDP 协议 一.socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...

  6. 运输层协议--TCP及UDP协议

    TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...

  7. TCP和UDP 协议发送数据包的大小

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  8. TCP/IP/UDP 协议

    互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作 ...

  9. 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

随机推荐

  1. free Google translator for the personal website

    free Google translator for the personal website https://html5.xgqfrms.xyz/

  2. 「NGK每日快讯」12.11日NGK公链第38期官方快讯!

  3. 鸿蒙Java开发模式11:鸿蒙图片裁剪功能的实现

    鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口] 目录: 1. 鸿蒙版图片裁剪功能效果展示 2.Java代码实现 3.裁剪工具类实现 4.<鸿蒙Java开发模式>系 ...

  4. 如何让别人访问我的电脑的vue项目

    步骤: 1.关闭防火墙. 2.修改build/webpack.dev.conf.js中的"const HOST = process.env.HOST"为"const HO ...

  5. 多Excel文件内容查询工具。

    多Excel文件内容查询工具. 告别繁琐重复的体力劳动,一分钟干完一天的活. 码云 github 下载 当需要在多个Excel表格中查询需要的信息是,一个文件一个文件的去查询非常麻烦. 虽然有其他方法 ...

  6. localforage indexedDB如何使用索引

    简单介绍下localForage.localForage 是一个 JavaScript 库,通过简单类似 localStorage API 的异步存储来改进你的 Web 应用程序的离线体验.它能存储多 ...

  7. Cloud Alibabab笔记问世,全网详解仅此一份手慢无

    转: Cloud Alibabab笔记问世,全网详解仅此一份手慢无 什么是Spring cloud alibaba Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案, ...

  8. POJ-3660(Floyd算法)

    Cow Contest POJ-3660 1.本题考察的是最短路,用的算法是Floyd算法 2.如果一个结点和剩余的n-1个结点都有关系,那么可以确定其排名 3.需要注意的是,判断是否有关系时,反向关 ...

  9. mysql 基本指令 1

    desc 表名  --查看表属性 show create table 表名 \g;  --查看代码 alter table 表名 auto_increment=20;  --改自增的值 MySQL:自 ...

  10. Linux开发环境搭建——deepin系统的使用

    上大学的时候就在自己的笔记本上安装过深度操作系统(deepin),当时好像是15.x的版本.毕业后第一家公司是全Mac办公,因在学校期间有过完全Linux环境下的开发体验,上手Mac非常快.非常爽.前 ...