深入浅析TCP/UDP——深入浅析TCP/UDP的异同



一、UDP

        UDP是一个简单的面向数据包的运输层协议,UDP的校验和,UDP对首部和数据部分都进行校验,而IP首部的校验和仅对首部进行校验,TCP的校验和也是对首部和数据部分都进行校验,UDP的校验和是可选的,TCO是必选的。

        UDP是不可靠的协议,没有超时和重传功能,当UDP数据封装到IP数据报传输时,如果丢失,会发送一个ICMP差错报文给源主机,另外,如果UDP数据报的发送端没打开UDP校验和,而接收端计算校验和有差错,那么UDP数据报将会被丢掉,也不会发送ICMP差错报文。

数据截断
         正是由于UDP最大数据报的限制(受限于上面的两个因素,一般都会小于65507),大于这个限制的数据报会被截断,从而发生数据丢失,且不会有任何数据丢失的通知,这也是UDP协议不可靠传输的另一个体现。TCP没有对最长报文段的限制,当然在超过MSS值时会产生分段,不会发生数据阶段。

二、TCP

        TCP传输控制协议,与UDP同处于传输层,使用相同的网络层,TCP提供了一种可靠的面向连接的数据传输服务,提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。

1、TCP的可靠性

        1、应用程序被分割成TCP认为最合适发送的数据块。这点与UDP完全不同,应用程序产生的UDP数据报长度将保持不变,加上IP首部后,才会进行IP分片。
        2、当TCP发出一个报文段后,它会启动一个定时器,等待目的端发确认收到这个报文段,如果没能及时收到该确认信息,则将重发这个报文段。
        3、 当TCP接收端收到发送端发来的TCP报文段时,它将发送一个确认,这个确认不是立即发送的,通常会推迟几分之一秒。
        4、TCP将保持它首部和数据的校验和。这是一个端到端的校验和,如果收到的报文段的校验和有差错,TCP将丢弃该报文段,同时不发送确认收到的消息,从而使发送端超时重发。
        5、TCP能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间,TCP的接受端只允许另一端发送接收端缓冲区所能接纳的数据,这将防止较快主机致使较慢主机的缓冲区溢出。
        6、TCP将对收到的数据进行重排序,将收到的数据以正确的顺序交给应用层。
        7、由于IP数据报有可能发生重复,TCP的接收端必须丢弃重复的数据。

2、TCP的传输策略

TCP对交互数据流和成块数据流采用不同的策略进行数据传输
交互数据流:小流量的数据交换,按下一个键,回写一个字符。
成块数据类型:FTP

(1)交互数据流

         捎带ACK
        捎带ACK的意思是,当接收端接收到TCP报文段后,并不立即发送ACK报文,而是等上一段时间,如果这段时间里该主机有数据要发送到远程主机,就将该数据捎带上ACK一起发送过去,很明显,这样可以减少传输开销。为了防止产生超时重传,绝大多数情况下,这个等待时间为200ms,超过了200ms,如果没有数据要一起发送,就直接发送ACK报文
         Nagle算法
        要求TCP连接上最多只能有一个没有被确认的数据报在传输。应用程序把要发送的数据逐个字节地从到TCP的发送缓存,发送放把先到的一部分数据先发送出去,把后面到达的字节缓存起来,当发送方收到前面字节的确认后才继续发送下一个报文段。Nagle算法还规定,当发送缓存中的数据达到发送窗口的一半或已达到报文段的MSS值时,就立即发送一个报文段。

(1)交成块数据流(对吞吐量要求较高的应用)

        滑动窗口

        滑动窗口的滑动是以字节为单位的,发送方A和接收方B在TCP三次握手的前两次握手时协商好了发送窗口和接受窗口的大小,发送方A根据B发送来的确认连接报文中标明的窗口的大小,来确定收到确认前的最大发送数据量,如果A接收到的B发来的确认报文中标明的窗口大小为0,则停止发送数据,直到收到不为0的确认报文,再继续发送。发送窗口表示在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去,凡是已发送过的数据,在没有收到确认前都要暂时保留,以便超时重传时使用。

        需要注意的一点是:使用TCP滑动窗口协议时,接收方不必确认每一个收到的分组,在TCP中,ACK确认是累积的,可以在接收到几个序号连续的报文段后只发送一个ACK确认报文,但累积等待的时间最长不能超过0.5秒,以防止发送端超时重传。

注意
1、缓冲空间和序号空间都是有限的,并且都是循环使用的。
2、窗口大小一定不大于收发缓冲区的大小
3、发送缓冲区用来暂存发送方准备发送的TCP报文段和已发送但尚未收到确认的数据。
4、接收缓冲区用来暂按序到达但尚未被上层应用程序读取的数据合未按序到达的数据

3、TCP流量控制

让发送方的速率不要太快,让接受方来得及接受。
在这里插入图片描述

        B进行了三次流量控制。第一次把窗口减少到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。

        我们考虑一种特殊情况,如果B在向A发送了零窗口报文段后不久,B的接收缓存又有了一些存储空间,于是B向A发送了一个rwnd=400的报文段,然而这个报文段在传送过程中丢失了,A就一直等待B发送非零窗口的报文通知,而B一直等待A发送数据,会造成死锁。

        为了解决上诉问题,TCP为每一个连接设有持续计时器,只要TCP连接的一方收到零窗口通知就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段,对方在收到探测报文段后,对该报文段的确认后给出现在的窗口值,如果窗口仍为0,重新设置持续计时器,如果窗口不为0就可以打破死锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP(传输控制协议)是一种面向连接的协议,用于在网络上可靠地传输数据。它提供了数据的可靠传输、流量控制和拥塞控制等功能,是互联网的核心协议之一。 在Node.js中,使用内置的net模块可以轻松地创建TCP服务器和客户端。下面是一个简单的TCP服务器示例: ```javascript const net = require('net'); const server = net.createServer((socket) => { console.log('client connected'); socket.on('data', (data) => { console.log(`received data: ${data}`); socket.write(`echo: ${data}`); }); socket.on('close', () => { console.log('client disconnected'); }); }); server.listen(3000, () => { console.log('server started on port 3000'); }); ``` 这个服务器会监听本地的3000端口,当有客户端连接时,会打印出“client connected”的信息。当客户端发送数据时,服务器会收到这些数据并将其打印到控制台上,然后将“echo: ”加在数据前发送回客户端。当客户端断开连接时,服务器会打印“client disconnected”的信息。 下面是一个简单的TCP客户端示例: ```javascript const net = require('net'); const client = new net.Socket(); client.connect(3000, 'localhost', () => { console.log('connected to server'); client.write('hello, server'); }); client.on('data', (data) => { console.log(`received data: ${data}`); client.destroy(); }); client.on('close', () => { console.log('disconnected from server'); }); ``` 这个客户端会连接到本地的3000端口,并发送“hello, server”的消息。当客户端收到服务器的响应时,会打印出这些数据,并断开连接。 总的来说,TCP网络通信中扮演着非常重要的角色,Node.js内置的net模块提供了简单易用的TCP套接字接口,使得我们可以轻松地创建TCP服务器和客户端。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值