TCP/UDP的几个重要概念

TCP是一个面向字节流的传输层协议。“流” 意味着 TCP 所传输的数据是没有边界的。这不同于 UDP 协议提供的是面向消息的传输服务,其传输的数据是有边界的。TCP 的发送方无法保证对方每次收到的都是一个完整的数据包。于是就有了粘包、拆包问题的出现。粘包、拆包问题只发生在TCP协议中

TCP/IP四层协议

4应用层:类似OSI模型中的7,6,5三层。即应用层、表示层、会话层。

3 传输层:类似OSI模型中的传输层。

2 网络层:类似OSI模型中的网络层。

1 网络访问层:类似OSI模型中的数据链路层和物理层的功能。

TCP 粘包,⼼跳包

粘包

一种情况 接收端只收到一个TCP报文段,去掉首部后,这一个报文段中包含了发送端发送来的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。

另一种情况 接收端收到了两个TCP报文段,但是去掉首部后,两个数据包要么是不完整的,要么就是多出来一部分,这种现象即为粘包、拆包问题。同第二种情况一样,由于不知道两个数据包的界限,对于接收端来说同样不好处理。

TCP粘包是指发送方发送的若干数据包到达接收方时粘成一个数据包,从接收缓存看,后一个数据包的头紧接着前一个数据包的尾。

TCP拆包是指应用程序的数据包被拆分成若干部分发送出去,从接收缓存看,接收方收到的只是数据包的一部分内容。

由此可见,粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的数据包。

应用进程写入的数据量大于TCP发送缓冲区的大小,这将会发生拆包

应用进程写入的数据量小于TCP发送缓冲区的大小,这将会发生粘包

解决方法:

(1)发送定长包。即发送端将每个数据包封装为固定长度(长度不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。(适合定长结构的数据)

(2)包头加上包体长度。发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便可以知道每一个数据包的实际长度了。(适合不定长结构的数据)

(3)在包尾部设置边界标记。发送端在每个数据包尾部添加边界标记,可以使用特殊符号作为边界标记。如此,接收端通过这个边界标记就可以将不同的数据包拆分开来。但这可能会存在一个问题:如果数据包内容中也包含有边界标记,则会被误判为消息的边界,导致出错。这样方法要视具体情况而定。例如,FTP协议就是采用 "\r\n" 来识别一个消息的边界的。

心跳包

跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着

心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒

因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多 且稍显复杂,而利用TCP/IP协议层为内置的KeepAlive功能来实现心跳功能则简单得多。

TCP滑动窗口,流量控制,拥塞控制详解

滑动窗口

窗口大小就是无需等待应答,而可以继续发送数据的最大值,通常大小是由接收方决定

流量控制

流量控制可以让发送端根据接收端的实际接受能力控制发送的数据量。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不会超过该大小的数据,该限制大小即为窗口大小,即窗口大小由接收端主机决定

拥塞控制

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大…

我们的TCP协议是无私的,网络传输中的事情他也要做出自己的贡献(你网络通畅,那我就做好自己,努力尽量的传输自己的东西;你网络堵了,我是个好人,就减少我发的东西,让你网络好一点),于是就有了拥塞控制,目的就是避免发送方的数据填满网络 为了调节我们的发送量,定义了一个叫做拥塞窗口的概念

拥塞控制主要用四个算法

  • 慢启动 当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1

  • 拥塞避免 每当收到一个 ACK 时,cwnd 增加 1/cwnd

  • 拥塞发生 当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传

  • 快速恢复 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了); 重传丢失的数据包 如果再收到重复的 ACK,那么 cwnd 增加 1; 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

TCP的三次握手和四次挥手

实质就是TCP通信的连接与断开

三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接受完毕后何时撤销联系,并建立虚连接

四次挥手:即终止TVP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开

TCP协议位于传输层,作用是提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP协议采纳三次握手策略

三次握手原理:

第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端

第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了

第3次握手:客户端再回传一个带有ACK标志的数据包,表示我收到了,握手结束

其中SYN标志位数置1,表示建立TCP连接;ACK标志表示验证字段

四次挥手:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;

第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态:

第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;

第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手

其中:FIN标志位数置1,表示断开TCP连接

TCP 和 UDP的区别

①有无连接: 使用UDP协议的通讯双方是随时可以进行数据传输的,无需建立连接,而TCP是面向连接服务的,在传输数据的时候需要三次握手进行连接。四次挥手释放连接

②是否支持广播或多播 UDP支持了广播、多播和单播的服务,而TCP只支持单播

③报文是面向字节流或报文段 UDP是面向应用报文,UDP对应用层交下来的报文,既不会拆分,也不会合并。TCP是面向字节流的,应用程序与TCP交互是一次一个大小不等的数据块,发送方的TCP把应用进程交付下来的报文数据块,看成是无结构的字节流,它不保证接收方收到的数据块和发送方发送的数据块具有对应大小关系。发送方TCP会将数据放入缓冲区,等到可以发送的时候再发送,TCP会根据发送策略,发送给接受方

④首部 UDP首部开销比较小,只有8字节,TCP最少首部为20字节,最大首部是60字节,主要因为他实现的功能比较多,实现可靠传输、拥塞控制、流量传输等等。

⑤可靠性 UDP向其上层提供无连接不可靠传输服务,数据可能会发生丢失,误码,但是传输效率高。所以主要适用于传输效率要求相对高,对准确性要求相对低和实时性要求高的场景,比如视频会议(因为我们可以接受图像稍微模糊一点,声音稍微不清晰一点)、网络语音电话、广播通信(广播、多播)

TCP向其上层提供面向连接可靠传输服务,传送的数据无差错、不丢失、不重复、按序到达;主要适用于传输效率要求相对低,但对准确性要求相对高和要求可靠传输的应用,比如文件传输(当我们下载文件,希望得到的是完整的文件,而不仅仅是文件的一部分)、接受邮件、远程登录;

6、 有序性 TCP传输数据有序,UDP不保证数据的有序性;

7 、TCP有流量控制和拥塞控制,UDP没有;

8、TCP传输速度相对UDP较慢;

9、TCP不保存数据边界,UDP保留数据边界;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值