TCP和UDP的区别(简单明了)

原文链接:TCP和UDP的区别(简单明了) – 编程屋

目录

1 前言

2 TCP

2.1 TCP如何保证可靠传输

3 UDP

1 前言

        你知道什么是TCP和UDP吗?你知道TCP和UDP有什么区别吗?可能大家平时总是听说过TCP和UDP,但是一直不知道它们是怎么回事。今天就给大家介绍一下。我们常用的网络通讯、软件聊天、以及大家平时所看的视屏都是通过这两种协议来进行数据传输的,那它们又是如何工作呢,又有什么区别呢。

注:本篇文章也是在B占看别的博主视频总结写的

2 TCP

2.1 基础介绍

1、TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
2、客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
3、TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)

TCP和UDP的区别(简单明了)_第1张图片

TCP和UDP都是在传输层,在程序之间传输数据,TCP是基于连接的,UDP是基于非连接的。

TCP和UDP的区别(简单明了)_第2张图片如果将进程与进程之间的通信看做是人与人之间的通信,那么假使人与人之间的通信方式有两种写信和打电话,那么写信大家都知道我们信件写完寄出去之后,我们无法知道对方是否收到,也无法知道对方收到的内容是否完整,知道对方信件收到的顺序是否正确,而打电话就不一样了,当电话接通之后,我们肯定要确认对方有没有接通然后互相通话,最后挂断的时候也会通知对方。根据上述例子就可看出写信的方式就和UDP的传输方式很像,而打电话的方式就和TCP的方式很像。那么TCP是如何保证上述过程呢?

URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:建立一个新连接。
FIN:断开一个连接。

2.2 TCP如何保证可靠传输

TCP保证上述过程有3个步骤:三次握手传输确认四次挥手

1)三次握手

TCP和UDP的区别(简单明了)_第3张图片

三次握手是建立连接的过程,当客户端向服务端发起连接时,会先发一包连接请求数据(SHN包)询问能否与你建立连接 ,如果对端同意连接则回复一包SYN+ACK包,客户端收到之后,回复一包(ACK包),连接建立,因为这个过程中,互相发送了三包数据,所以称为三次握手。

问题1:为什么是3次握手而不是2次握手。

为了防止已经失效的请求报完。突然又传到服务器引起错误。

如果采用了两次连接,客户端向服务端发送了一个SYN包来请求建立连接,因为一些原因并没有到达服务器在中间某个网络节点产生了滞留,为了建立连接客户端重新发送SYN包,这次数据包正常送达,服务端回复SYN+ACK后建立了连接,但是第一包数据阻塞的网络节点突然恢复,又达到服务端。此时服务端认为是客户端重新发起了一个新的连接,从而在两次握手之后进入等待数据状态。服务端认为是两个连接,客户端认为是一个连接,造成了状态不一致,如果在三次握手情况下,服务端在收不到ACK情况下,连接自然不会建立成功。

TCP和UDP的区别(简单明了)_第4张图片

所以3次握手本质上说就是解决网络信道不可靠的问题,为了能够在不可靠的信道上建立起可靠的连接。

问题2:如何处理丢包问题和乱序问题

        TCP协议为每一个连接建立了一个发送缓冲区,从建立连接的第一个字节号为0,后面每个字节的序列好就会增加1,发送数据时,从发送缓冲区取一部分数据组成发送报文,在其tcp头中会附带序列号和长度,接收端在收到数据后需要回复确认报文,确认报文中的ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式,能够使发送端确认发送的数据,已经被对方收到,发送端也可以一次性发送多包数据,接收端只需要回复一次ACK就行了这样发送端可以将待发送的数据分割成一系列的数据发送到对端,对端根据序列号和长度在接收后重构出完整的数据。

如果丢失了某些数据,可以要求发送端重传,比如丢失了100~199这100个字节接收端向发送端发送ACK等于100的报文,发送端发送后重传这包数据,接收端进行补齐,以上过程不区分客户端和服务端,TCP连接是全双工的,对于两端连接均采用上述机制

2)四次挥手

TCP和UDP的区别(简单明了)_第5张图片

 处于连接状态下客户端和服务端,都可以发起关闭连接请求,此时需要4次挥手来进行连接关闭,假使客户端主动发起连接关闭请求它需要将服务端发送一包FIN包,表示要关闭连接,自己进入终止等待1状态(第一次挥手),服务端收到FIN包,发送一个ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态(第二次挥手),服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送完一包FIN包进入最后确认状态(第3次状态),客户端收到之后回复ACK包,进入超时等待状态,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包,立即关闭连接(第4次挥手

问题3:为什么客户端需要等待超时时间

为了保证对方已经收到ACK,因为假设客户端发送最后一包ACK后就释放了连接,一旦ACK包在网路中丢失,服务端将一直停留在最后确认状态,如果客户端发送发送最后一包ACK后等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间,这个机制和3次握手一样保证不可靠的信道上建立起可靠的连接。

问题四:为什么建立连接是三次握手、断开连接是四次

1)当Server端收到Client端的SYN连接请求报文时,会同时发送FYN+ACK报文。其中FYN报文是用来同步的,ACK报文是用来应答的。

2)但关闭连接时,Server端收到Client端的FIN报文时,可能并不会立即关闭Socket,所以只能先发送一个ACK报文,响应Client的应答。

3)当Server端所有的消息发送完毕之后,才能发送FIN报文。所以并不会一起发送。所以需要四次挥手

3 UDP

TCP和UDP的区别(简单明了)_第6张图片

udp协议是基于非连接的,发送数据就是简单将数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系所以udp的性能损耗非常小,对于CPU,内存资源的占用也远小于tcp,但是对于网络传输过程中产生的丢包,udp协议并不能保证,所以udp在传输稳定性上要弱于tcp。

以上只是部分内容,为了维护方便,本文已迁移到新地址:TCP和UDP的区别(简单明了) – 编程屋

你可能感兴趣的:(计算机,Java基础,tcp/ip,udp,网络)