计算机网络——TCP与UDP的特点与区别

TCP与UDP

1、TCP/IP网络模型

  • TCP/IP网络分为四层
    • 应用层,负责向用户提供应用程序、消息等,比如HTTP、FTP、DNS、SMTP等协议
    • 传输层:负责对报文进行分组和重组,并以TCP或者UDP协议封装报文
    • 网络层:负责路由转发IP包,把报文发送给目标网络或者主机
    • 主机至网络层:对应OSI七层中的物理层和数据链路层,负责以二进制的数据形式在物理载体上传输数据。TCP/IP面向网络,主机如何连接至网络不是TCP/IP考虑的问题。

2、TCP的特点

面向连接

  • TCP是面向连接的传输协议,也就是在传输数据之前必须在两端建立连接。建立连接的方法是三次握手,这也为数据的可靠传输打下基础。

仅支持点对点传输

  • 每条TCP传输连接只有两个端点,只能进行点对点的数据传输,不能进行多播或者广播传输方式。

面向字节流

  • TCP在不保留报文边界的情况下以字节流的方式进行分组传输。

可靠传输

  • TCP的传输是可靠的,即保证数据一定可以传给对方并且顺序正确。具体实现的手段是乱序重排、应答确认、报文重传以及流量控制。

提供拥塞控制

  • TCP协议会监控网络是否同一时间有太多数据包传输,也就是网络是否出现了拥塞,从而减少向网络注入数据的速率以及数量,缓解拥塞。

3、UDP的特点

面向无连接

  • UDP在传输的时候不需要建立连接,想发送数据的时候就可以开始发送了

面向报文

  • UDP不会对报文进行拆分,也就是应用层交付给传输层的报文,UDP只在头部加入一个UDP表示就给网络层了,也就以为着UDP传输一份报文的大小不固定且有可能很大,所以UDP的数据缓冲区通常会放在外存上。

不可靠的

  • UDP是无连接的想发就发,并且发送数据的时候不考虑对方是否接收到,顺序是否正确,并且UDP没有拥塞控制,也就是以恒定的速率传输,缺点就是在网络不好的情况下可能会导致丢包,但是优点也很明显,实时性很高,比如视频会议的时候首要保证的是数据的实时性,至于时不时卡一下也就是丢包了,我们也不会在意之前卡的几秒的信息是什么。

4、TCP三次握手

具体过程

  • 一次握手:客户端发送请求连接报文。
  • 二次握手:服务端接收到请求连接报文,同意连接,回复一个请求连接确认报文。
  • 三次握手:客户端接收到服务端的确认,发送一个普通TCP确认报文
  • 前两次握手的报文是不携带数据的,第三次握手是普通TCP确认报文,带不带数据都可以,不带数据的话,下次报文序号不变。三次握手结束,TCP连接建立完成

为什么是三次握手

  • 只有一次握手,则完全没办法知道连接是否建立完成。
  • 只有两次握手,客户端知道服务器能接受到消息,但是服务端不知道客户端能不能收到。
  • 三次握手之后,客户端和服务端都知道对方可以接受到消息,连接建立完成。
  • 假设只有二次握手还有一种情况就是,客户端发送第一次请求连接报文,超时了,于是发送第二次请求,这次连接结束之后,双方都进入了close状态。这个时候,服务端接收到了超时的那次请求报文,于是他回复确认报文,而且因为没有第三次握手,服务端直接进入了接连完成的状态,一直等待客户端发送数据,但是客户端处于close状态不会处理确认报文,导致服务端大量资源浪费。
  • 而如果是三次握手,服务端接受到超时的请求报文后回复确认报文,不会直接进入连接完成状态,而会等待确认,长时间没收到则结束,不会过多的浪费资源。

5、TCP四次挥手

  • 连接过程中,双方都可以释放连接,这里假设是客户端先释放连接

具体过程

  • 一次挥手:客户端发送连接释放报文
  • 二次挥手:服务端回复连接释放确认报文,客户端接到确认报文之后进入半关闭状态,也就是不在发送数据,但是能接收数据,因为此时服务端的数据可能还没有发送完毕。
  • 三次挥手:服务端的数据也发送完毕了,它也发送一条连接释放报文。
  • 四次挥手:客户端收到连接释放报文后,回复一条确认报文,并进入等待状态,等待2被的MSL时间后,关闭连接。而在服务端,服务端接收到确认报文即进入关闭状态。

为何要等待2倍的MSL事件

  • 首先MSL时间是报文最大寿命,在四次挥手的时候,客户端回复确认报文,并进入等待状态,如果这条确认报文没有正确收到,服务端则会再次发送一条请求释放报文,此时由于客户端还在等待状态,能处理这条报文,即再次回复确认报文,2MSL就是保证能收到这条重发的请求释放报文,如果2MSL都没收到,说明服务端正确关闭了。
  • 而如果直接进入关闭状态而不是等待状态,服务端第二次重发请求释放报文的时候,由于客户端已经关闭不会处理,所以服务端就会一直处于等待回复的状态而不能关闭。
  • 其次两倍的MSL也是保证在这次连接中的所有报文都以及处理完毕,下次连接不会收到来自上次连接的过时的数据。

为何需要四次握手

  • 在TCP连接中,数据传输是双工且独立的,也就是一方请求释放的时候,另一个可能还有数据需要发送,所以把两次请求释放分开为分别两次握手,四次握手后保证双方都不再有数据需要传输了。

6、TCP的可靠传输

乱序重排

  • TCP传输以字节流进行传输,也就是一个报文会被分割成许多小的报文段,也就意味着在传输过程中一个报文的每个报文段可能接收是乱序的。不过TCP为每个段都封装有序号,只需要在接收段进行重组即可得到正确的顺序。

应答确认

  • TCP每次发送的数据中都有序号,接受到数据的同时会回复一个确认,告诉对方自己收到了这个序号的数据。这也就保证双方正确接收到对方的数据,同时这里还有捎带应答的优化策略提高效率。

报文重传

  • 报文重传是在对方没有正确收到这份报文段的时候,进行重新传输,分为超时重传和快速重传。
    • 超时重传,是超过一定时间没有收到某个序号的确认报文,也就是这份报文段没有被正确接收,于是重新发送。
    • 快速重传,是在接收方希望收到X序号的报文时,却收到比X大的报文,于是就连续发送三次X的确认报文,接收方收到这个消息后会立即重传X序号报文而不会等待超时。

流量控制

  • 在数据传输时,无论时发送还是接收,都会有一个缓冲区,这个缓冲区反映了处理数据的能力,如果发送数据太快,接收方来不及处理就会造成缓冲区溢出,所以需要协调双方的速率。
  • 使用滑动窗口机制来调整发送速率,即在报文段中加入窗口大小信息,发送方的发送窗口不能大于接收方的接收窗口。若接收方没有足够的缓冲区,就发送一个零窗口的报文,发送方收到之后会停止发送数据,转而周期性的发送一个窗口探测报文,接收方在回复确认报文的时候会给出自己的窗口大小。

7、TCP粘包

粘包原因

  • TCP是面向字节流的,也就是不会保存报文边界,并且由于优化算法,发送端会把多次小分组合起来一起发送,而在接受方看来就是前一个数据的尾紧接着收一个数据的头,无法分别是否属于两个数据包了。
  • 接收方也可能造成粘包,接收到的数据并不是立即交给应用层处理,而是放在缓冲区中,所以缓冲区堆积也会造成粘包

什么时候需要处理

  • 如果多个分组属于一块数据的不同部分,比如一个文件分成多个部分发送,这时候不需要处理粘包
  • 但是如果多个分组属于不同数据,就需要处理了。

处理方式

  • 交给应用层处理,以数据为单位进行读取,如何标识数据长度有两种方法:
    • 格式化数据,即在每条数据的开始和结尾加上标识符
    • 记录长度,在发送数据时,将数据长度一起发送。

UDP是否会发生粘包

  • TCP为保证可靠传输减少花销,将报文分组基于字节流传输,没有消息边界。
  • 而UDP是面向报文传输,一个数据一次传输,保留了消息边界,不存在粘包问题。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值