TCP与UDP
TCP与UDP的定义与区别
TCP是一个面向连接,客户端与服务器的连接,可靠,基于字节流的传输层协议。双方互相通信之前,TCP需要三次握手建立连接,而UDP没有建立连接的过程。TCP继承了IP层的特性,TCP为了维护状态,将一个个IP包变成了字节流。
UDP是一个面向无连接的传输层协议,UDP的数据传输是基于数据报的。
TCP协议特性
全双工通信:TCP 协议允许通信双方的应用程序在任何时候都能发送数据。TCP 连接的两端都设有发送缓冲区和接收缓冲区,用来临时存放双向通信的数据。发送数据时,应用程序把数据传送给 TCP 的发送缓冲后,就可以做自己的事情,而 TCP 在合适的时候将数据发送出去。在接收的时候,TCP 把收到的数据放入接收缓冲区,上层应用在合适的时候读取数据。
因此引发TCP粘包拆包问题:
TCP连接传输过程
-
应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
-
应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
-
进行 MSS (最大报文长度)大小的 TCP 分段,当 TCP 报文长度-TCP 头部长度>MSS 的时候将发生拆包。
-
接收方法不及时读取套接字缓冲区数据,这将发生粘包。
TCP粘包拆包解决方案:
-
使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
-
设置定长消息,服务端每次读取既定长度的内容作为一条完整消息,当消息不够长时,空位补上固定字符。
-
设置消息边界,服务端从网络流中按消息编辑分离出消息内容,一般使用‘\n ’,FTP协议就是这样的。
TCP协议可以保证可靠传输:
自动重传请求 ARQ 协议:它的信道利用率较低
超时重传:
当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段
当tcp接受端收到包,检验出包出错,丢弃报文段,不给出响应,tcp发送端会超时重传
停止等待协议:
1.停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组
2.在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认,表明前一个确认信息,发送方没有收到,如果收到了也不会发送重复分组
连续ARQ协议:不能向发送方反映接收方已经正确收到的所有分组信息
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发 送确认,表明到这个分组为止的所有分组都已经正确收到了。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息(因为只收到了第二条的返回信息,就以为只成功了两条)
通过滑动窗口来实现流量控制。
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
流量控制是为了控制发送方发送速率,保证接收方来得及接收。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。
慢开始:如果立即开始大量字节注入网络,就会引起网络阻塞,先试探一下,逐渐增大发送窗口,也就是从小到大逐渐增加拥塞窗口的值。
拥塞避免: 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1.
快重传和快恢复:接受方接受到一个不按顺序的数据段,就会立即给发送方发送一个重复请求,发送方连续接受三个重复请求,会认为数据段丢失,会立即重传丢失的数据段。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
UDP协议特性:
UDP是无连接,通信不需要建立和断开连接,UDP是不可靠的,不关心数据的安全等问题,UDP是没有拥塞控制,在网络条件不好的情况下可能会导致丢包和后发先至(包的顺序)。
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/13721023.html