快速了解TCP和UDP

蒋义渠
• 阅读 1565
声明:此文章仅是作者自学整理的内容,并非原创,因思否无法设置转载多篇文章只能选择原创。参考文章见文章末尾,文章引用形式不严谨,敬请见谅。

1. TCP/IP 协议族

首先,TCP 和 UDP 同属于 TCP/IP 协议族,这个协议族内还包括其他诸如 HTTP, SMTP, FTP, IP, ICMP, IPX 等等协议。

作者之前整理的另一篇文章《计算机网络分层结构归纳》中有提到过 TCP/IP 四层结构参考模型。这个模型也可以视为上述协议的总称,协议分成了四层。其中传输层就包含了两个重要的协议,TCP 和 UDP。

2. TCP 和 UDP 的区别

UDP

全称 User Data Protocal (用户数据报协议),是一种无连接的协议。有不提供数据包分组、组装和重排序的特点。所以,无法得知 UDP 发送的包是否完整到达。

快速了解TCP和UDP

  • 面向无连接

    不需要像 TCP 一样进行三次握手,指搬运数据,不对数据做任何处理。

  • 可单播、多播、广播

    可以一对一、多对一、多对多

  • 面向报文

    对应用层(这里指的是四层模型的应用层)下放的数据报文,只添加首部就交给 IP 层,不做其他处理

  • 不可靠

    不需要建立连接;不关心接收方是否收到;不处理数据,想发什么就发什么;不备份;不做拥塞控制,不控制传输速率

  • 头部开销小

    只有 8 个字节(1 字节 8 位),比 TCP 头部至少 20+ 字节开销小很多,见下图👇

    快速了解TCP和UDP

TCP

全称 Transfer Control Protocal (传输控制协议),是面向连接的、可靠的、面向字节流的传输层通信协议。

快速了解TCP和UDP

根据 RFC 793 的『连接』定义,用于保证传输可靠和流量控制维护的状态信息,这些信息的组合,包括序列号、Socket、窗口大小,被称为连接。因此,TCP 连接即为满足上述定义的,包括用于确定来源和出处的Socket(IP 和 port)、确定排序的序列号和确定流量控制的窗口大小等状态信息组成的连接。下图👇能看出,TCP 头部确实包含了这些信息。

快速了解TCP和UDP

  • 面向连接

    发送数据前必须进行的『三次握手』进行连接确认

  • 单播

    只能进行端对端的连接,不能实现广播

  • 面向字节流

    不保留报文边界,以字节流传输

  • 可靠

    判断丢包、误码,依靠序列号和确认号。超时重传

  • 拥塞控制
  • 全双工通信

小结

TCPUDP
是否连接连接无连接
是否可靠可靠,流量控制,拥塞控制不可靠,没有流量控制和拥塞控制
连接对象数单播单播,多播,广播
传输方式面向报文面向字节流
首部开销8字节20-60 字节
使用场景实时应用,视频等对内容可信度要求高,文件传输等

参考文章

  1. 一文搞懂TCP与UDP的区别 - Fundebug - 博客园 (cnblogs.com)
  2. 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题 (qq.com)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
DevOpSec DevOpSec
4年前
Linux主机安全配置
1.安全配置规范1.身份鉴别1.账号检查<tableborder"1"cellspacing"0"style"width:426.1pt;"<tbody<tr<tdstyle"width:113.4pt;"<pstyle"marginleft:0pt;"<strong<strong安全配置编号
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
蒋义渠
蒋义渠
Lv1
孤云独鸟川光暮,万井千山海色秋。
文章
5
粉丝
0
获赞
0