简单说网络: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:速度快,但是可能产生丢包,适用于对实时性要求较高的,但是对少量丢包并没有太大要求的场景:语音通话、视频直播等

相关推荐
比兔代理4 小时前
正向代理与反向代理技术辨析,为什么代理 IP 属于正向代理
服务器·网络·http·ip
小贺儿开发5 小时前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
Ivanqhz6 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
迪康Defender8 小时前
终端安全实战:如何高效解决企业U盘泄密与管控难题
运维·网络·安全·web安全·终端安全管理
网安小学生(兼顾数据库版)8 小时前
固件+软件供应链:ONEKEY+Mend如何实现全链路安全覆盖
网络·安全·web安全
学习中的码虫9 小时前
网络编程5
服务器·网络
GPU实战笔记9 小时前
本地跑不动 llama.cpp,临时租云 GPU 怎么搭?从启动服务到环境复用
java·服务器·网络·人工智能·深度学习·llama
发量惊人的中年网工10 小时前
2026年DDoS防护方案怎么选?从攻击响应、清洗位置到成本账单,解析全球高防方案
大数据·网络·安全·ddos
黄昏回响12 小时前
软件工程基础知识(五):软件测试详解(下篇)——现代测试实践与论文指导
网络·其他·软件工程·改行学it
万联WANFLOW13 小时前
网络排障:如何从延迟、丢包、带宽定位海外访问异常
网络·架构·业界资讯