一、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. nodejs 在windows10中设置动态(视频)壁纸

    github 项目地址 node版本 λ node -v v12.16.2 main.js const ffi = require("@saleae/ffi"); const ch ...

  2. 高倍币VAST了解一下,如何掀起算力挖矿新热潮?

    随着比特币.以太坊等主流数字货币的起起落落,市场对于数字货币交易似乎进入了冷却期.很多生态建设者开启了观望态度,机构以及巨鲸们也开始纷纷着手分散投资.就在此时,一个新的概念逐步露出头角,吸引了大众关注 ...

  3. “NGK公链+5G”——打造智慧城市

    智慧城市目前被全球各国当成城市建设的重点,旨在城市在智能化的同时,还能给民众带来幸福感和安全感.随着5G的到来,城市智能化又到了一个新的高度.比如无人驾驶.无人机等方面将会产生质的变化,因为5G的加入 ...

  4. 20_MySQL表的内连接实操

    -- 查询底薪超过公司平均底薪的员工信息 -- 方法1 SELECT empno,ename FROM t_emp HAVING sal>AVG(sal); 因为在having中不能拿一个字段与 ...

  5. 数据归一化 scikit-learn中的Scaler

    1 import numpy as np 2 from sklearn import datasets 3 4 # 获取数据 5 iris = datasets.load_iris() 6 X = i ...

  6. rabbitMQ高可用方案

    普通模式 默认的集群模式,以两个节点(rabbit01.rabbit02)为例来进行说明.对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和r ...

  7. JDK源码阅读-Reference

    本文转载自JDK源码阅读-Reference 导语 Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象. 如果 ...

  8. 微信小程序:页面全局参数(注意不是小程序的全局变量globalData)

    为什么要使用页面全局参数:方便使用数据. 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个页面全局参数.因为取数据使用this.xxx即可,中间不用加data,给页面全局参数赋值页方便,直 ...

  9. 读懂RESTful风格

    RESTful就是资源定位和资源操作的风格.不是标准也不是协议. REST即Representational State Transfer的缩写,可译为"表现层状态转化".REST ...

  10. keras环境搭建

    操作系统 : CentOS7.5.1804_x64 Python 版本 : 3.6.8 keras + tensorflow 环境搭建,使用cpu,安装命令如下: virtualenv -p /usr ...