| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP与UDP的爱恨情仇 -> 正文阅读 |
|
[网络协议]TCP与UDP的爱恨情仇 |
很多人都把TCP与UDP拿来比较,那我们今天就来说说他们之间的爱恨情仇! 再奔入主题之前,我们先来看一张图 ? ?首先,从这张图中可以发现,tcp、udp属于传输层,那我们就聊聊吧! 首先,我们从以下这几个方面聊: 第一:是什么?第二:解决了什么问题?第三:应用场景是什么?第四:TCP的生命周期?那我们就开始解答这三个问题吧 我们从广义上来说: ? ? ? ? ?1) TCP 其实是一个有状态服务(通俗地讲就是有脑子的,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行),TCP头包括:目标端口、源端口、序号、确认序号; ? ????????主要有以下这几种特点: ? ? ? ? 1、TCP 是面向字节流的,发送的时候发的是一个流,没头没尾; ? ? ? ? 2、TCP 提供可靠交付。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达; ? ? ? ? 3、TCP 是可以有拥塞控制的,它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点; ? ? ? ?2) 而UDP 则是无状态服务(通俗地说是没脑子的,应用让我发多少就发多少,发出去就发出去了);它的请求头只有源端口、目标端口(为什么只有这两个,我们从他的特性来分析); ? ? ? ? 主要有以下特点: ? ? ? ? 1、继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收; ? ? ? ? ? (特性:IP 包可不是一个流,而是一个个的 IP 包) ? ? ? ? 2、UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。 ?????? ?? (IP特性:IP 包是没有任何可靠性保证的,一旦发出去,就像西天取经,走丢了、被妖怪吃了,都只能随它去) ? ? ? ? 3、像TCP本身是可以有拥堵控制的,而UDP则不会,它会无头脑的听从应用命令; 接下来,我们通过应用场景来聊解决了什么问题,俗话说,不在业务场景下聊技术,都是在耍流氓; ? ? ? ? 我们从他们的特性分析,像UDP他是一种无状态,无感知的协议,需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用,所以它会适用于什么场景呢? 对,像视屏,实时游戏应用,他们需要处理速度快,时延低,可以容忍少数丢包,比如我们看个视频,突然卡住了,丢了几帧,其实看视频的人不会有感知,如果连续丢,就会有感知了; ? ? ? ? TCP在我们工作中就会有很多场景,比如:工作中的HTTP请求,HTTPS请求,包括SpringCloud的Feign,他们的底层都是TCP协议,为什么他们对包的要求性非常高,不言而喻,大家都知道,这里我就不过多解释了; 既然我们工作中经常用到TCP,接下来,那我们就细聊一下它; 除了以上我们聊过的TCP相关知识,大家还能想到什么?对,生命周期;TCP的生命周期相对复杂;他需要三次握手四次挥手,但是大家知道为什么是三次握手四次挥手吗?为什么不是一次或者两次? ????????如果一次握手,A发起建立连接,B拒绝连接,A不知道,则连接失败; ? ? ? ? 如果两次连接,如果A请求建立连接,网络包一入网络深似海,可能走丢可能迷路,A一直接收不到回应,一直重发,过了一段时间,B接收到了迷路的网络包,B就以为建立了连接,但是此时A可能已经挂了,所以两次建立也不成立; ????????三次连接,如果A请求建立连接,同样会发出请求连接包,当B接收到了A请求的网络包,会告诉A,我愿意建立连接,给他发送回复包; ?????? A接收到之后就知道B愿意跟他建立连接;所以没有必要四次五次的握手; 四次挥手也是同样的道理; 建立连接成功后,以下问题我们应该如何处理: 如果建立连接之后,长时间不发数据,如何处理? 开启 keepalive 机制,即使没有真实的数据包,也有探活包 如何保证B接收到的是A发出的网络包? TCP头包有端口 如何保证这三个包是同一组网络包的? 通过序号(序号是随着时间的变化生成的) 如何维护连接? 双方都会建立一个状态机; 四次挥手还有很多问题: 如果A告诉B想要断开连接,B回复好的之后,B又告诉A我也要断开,直接断开,A还会重复回复B,如何处理? 如果A直接跑路了,A的端口就会空出来,被其他应用占用,则新的应用很可能接收到B的回复包,如何处理?等等一系列问题;等我们下次再一起讨论; 这是本人对UDP、TCP的见解,如有误差,欢迎指正; |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:13:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |