当前位置: 首页 > article >正文

简单说网络:TCP+UDP

TCP和UPD:

(1)都工作在传输层

(2)目的都是在程序之中传输数据

(3)数据可以是文本、视频或者图片(对TCP和UDP来说都是一堆二进制数没有太大区别)

一、区别:一个基于连接一个基于非连接

将人与人之间的通信比喻为进程和进程之前的通信:基本上有两种方式(1)写信;(2)打电话;这两种方式在不考虑速度的情况下,这两种方式最大的区别在于:

写信:需要考虑以下三点----所以寄出的的信都变成了未知数,

(1)对方是否可以收到;

(2)收到的信内容是否完整;

(3)先后写两份信过去是否按顺序接收

打电话:

(1)电话接通

(2)互相通话

(3)结束挂断

打电话时以上三个步骤流程都能得到及时的反馈,并且能确认到对方准确的接收到;

重点:打电话是基于连接的也就是TCP协议,而写信是基于非连接的—UDP协议

二、TCP和UDP的实现过程

1、TCP是如何保证以上过程的?有三个关键步骤:三次握手 传输确认 四次挥手;

(1)三次握手是建立连接的过程: 当客户端向服务端发起连接时,会发一个包连接请求数据,过去询问是否可以和服务端建立连接,这个包我们称之为SYN(同步)包;;; 如果服务端收到SYN包同意连接,则回复一个SYN+ACK(同步确认)包;;; 客户端接收到服务器的 SYN-ACK 包后,会发送一个确认包 ACK,确认连接;因为以上过程中相互发送了三包数据,所以称之为三次握手;

在这里插入图片描述

重点:为什么是三次握手而不是两次握手?如果在服务端发送SYN+ACK包后就建立连接,会出现已失效的报文突然又传到服务器引起错误;;;什么意思?假设采用两次握手建立连接,客户端向服务端发送了一个SYN包,来请求建立连接,因为某些未知的原因没有到达服务端,在中间某个网络节点产生了滞留,那么这种情况下为了建立连接,客户端会重发SYN包,这次的数据包正常送达,服务端回复SYN+ACK之后建立了连接,但是第一包数据阻塞的网络节点突然恢复,第一包SYN包有送达到了服务端,这时候服务端会误认为是客户端有新发送了一次请求连接,从而在两次握手之后进入等待数据状态;;;----最终:客户端认为是一次连接,而服务端认为是两次连接,造成了状态不一致,那么如果在三次握手的机制下,服务端收不到最后的ACK包,自然不会认为建立连接成功,所以综上所述,三次握手从本质上来说就是为了解决网络信道不可靠的问题,为了能够在不可靠的信道上建立可靠的连接;经过三次握手之后,客户端和服务端都进入了数据传输状态;

我们以上说过TCP协议需要在不可靠的信道上保证可靠的连接,还有几个问题需要面对:(1)一包数据有可能被拆成多包数据,如何处理丢包问题(2)这些数据包到达的前后顺序不同,如何处理乱序问题;;;针对以上问题,TCP为每一个连接建立了一个发送缓冲区,从建立连接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1,发送数据时,从发送缓存区取一部分数据组成发送报文,在其TCP协议请求头中会附带序列号和长度,服务端在接收到数据后,需要恢复确认报文,确认报文中的ACK=序列号+长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式能够使发送端确认发送的数据被对方收到,发送端可以一次发送连续的多包数据,接收端只需要回复一次ACK就可以了,这样发送端可以把待发送的数据分割成一系列的碎片发送到接收端,接收端根据序列号和长度在接收后重构出来完整的数据,假设其中丢失了某些数据包,在服务端可以要求发送端重传,比如丢失了序列号100-199这一百个字节,接收端向发送端发送ACK=100的报文,客户端收到后会重传这一包数据,然后服务端进行补齐;

在这里插入图片描述

(2)四次挥手:处于连接状态的客户端和服务端都可以发起关闭的连接请求,此时需要四次挥手来进行关闭连接,假设客户端主动发起了关闭连接请求:第一次挥手:客户端需要向服务端发送一包FIN包,表示要关闭连接,自己进入终止等待1状态;第二次挥手:服务端收到FIN包,发送一包ACK包表示自己进入关闭等待状态,客户端进入终止等待2状态,此时服务器不再接收客户端的数据,但仍可以向客户端发送数据,客户端也可以接收数据;第三次挥手:当服务器也准备好关闭连接时,会发送一个 FIN 包给客户端,进入最后确认状态;第四次挥手:客户端收到服务器的 FIN 包后,发送一个 ACK 包作为确认。此时,进入超时等待状态,经过超时时间之后TCP 连接关闭,服务端收到ACK包后立即关闭连接;(为什么客户端需要等待超时时间,为了保证服务端已收到ACK包,如果客户端发送ACK包后,不等待超时时间直接释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态)

在这里插入图片描述

四次挥手的目的:在不可靠的网络连接中进行可靠的连接断开确认

二、UDP协议:UDP协议是基于非连接的,发送数据就是简单的将数据封装一下,将数据从网卡发出去就可以了,数据包之间并没有状态上的联系,正因为有UDP这种简单的处理方式,导致它的性能损耗非常少,对于CPU内存资源的占用也远小于TCP,但是对于网络传输过程中产生的丢包UDP协议并不能保证,所以UDP在传输稳定性上要弱于TCP

在这里插入图片描述

综上:

TCP:稳定可靠,需要准确无误的传输给对方,传输文件、发送邮件、浏览网页

UPD:速度快,但是可能产生丢包,适用于对实时性要求较高的,但是对少量丢包并没有太大要求的场景:语音通话、视频直播等


http://www.kler.cn/a/231924.html

相关文章:

  • AI行业动态:AGI预测、模型进化与工具革新
  • mac上使用docker搭建gitlab
  • MySQL中Flashback(闪回)技术
  • 《AI 之影》
  • Rust 语言学习笔记(五)
  • 【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析
  • 上海泗博HART转ModbusTCP网关HME-635应用案例之组态王和超声波液位计通信
  • 解决“org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务器。服务器未关闭“
  • c++阶梯之类与对象(中)< 续集 >
  • Mac利用brew安装mysql并设置初始密码
  • <网络安全>《15 移动安全管理系统》
  • Pytorch+NCCL源码编译
  • 【Web】vulhub Fastjson反序列化漏洞复现学习笔记
  • Leetcode第383场周赛
  • 26.云原生ArgoCD高级之ApplicationSet
  • Linux openKylin(开放麒麟)系统SSH服务安装配置与公网远程连接
  • ubuntu22.04安装部署02:禁用显卡更新
  • debian12 解决 github 访问难的问题
  • 反向迭代器
  • SQL Parser
  • JavaScript流程控制详解之循环结构(倒三角、九九乘法表)
  • C语言:矩阵中的最小元素
  • On the Spectral Bias of Neural Networks论文阅读
  • Docker-Learn(一)使用Dockerfile创建Docker镜像
  • Windows SDK(四)鼠标和键盘消息处理
  • 已解决:tpm2_createpriimay: command not found