TCP和UDP的区别

1、TCP是面向连接的,TCP在传递数据之前,会有三次握手来建立连接,四次挥手断开连接;UDP是无连接的,即发送数据之前不需要建立连接。

2、TCP是可靠的。在数据传递时,通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输,在数据传完后,还会断开连接用来节约系统资源。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;而UDP是不可靠的,不稳定。因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而UDP在传输途中如果出现了丢包,也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。

3、TCP对系统资源要求较多,UDP对系统资源要求较少。

4、TCP是字节流服务,而UDP是数据报服务。

字节流服务:

(1)发送方send数据的次数与接收方recv的次数没有必然联系。

(2)发送缓冲区中的数据具体分成几个TCP报文段传输,每个报文段携带多少数据与send情况无关,只与当前网络环境相关。

(3)接收方接收数据时,所有接收到的TCP报文段中的数据都会被存储接收缓冲区中,recv直接从接收缓冲区获取最大能获取到的字节数据。

(4)发送数据和接收数据对于数据而言没有明确的界限。

数据报服务:

(1)发送方sendto的次数与接收方recvfrom的次数相等。

(2)一次sendto对应底层一个UDP报文段。

(3)如果recvfrom一次未将UDP报文段的数据读取完成,则剩余的数据会被丢失。

5、UDP是一个无状态的传输协议,所以它在传递数据时非常快,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

6、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

7、UDP比TCP稍安全,没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击。

用三次握手建立TCP连接:

ACK: TCP报头的控制位之一,对数据进行确认。确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了。比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。

SYN:同步序列号,TCP建立连接时将这个位置1

FIN:发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1

为什么是三次握手而不是两次握手?

(1)两次握手会浪费服务器资源。主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况。A发出连接请求,但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。现在假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留了,以延误到连续释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B确认为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样白白浪费了。采用三次握手的办法就可以防止上述现象的发生。例如在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。

(2)两次握手会死锁。例如,考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建立什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

为什么不是四次握手?

四次握手会浪费网络资源。握手握的是序列号,四次握手的过程是:A发送给B同步序列号SYN+A的seq为x;B收到后确认收到ACK发给A,然后令ack=x+1,确认A的seq按序到达;B向A发送SYN+自己的序列号seq为y;A收到B的序列号,存储到本地,发送ack=y+1,确认收到了,发送ACK+ack和自己的新序号seq为x+1。这个过程我们完全就可以将第二步和第三步归为一次发送,就不需要四次握手。

SYN攻击:

在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接,此时服务器处于SYN_RECV状态。当收到ACK后,服务器转入ESTAB-LISHED状态。SYN攻击就是,攻击客户端,在短时间内伪造大量不存在的IP地址,向服务器不断发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求将被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。SYN攻击是一个典型的DDOS攻击,当我们在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。

四次挥手的过程:

注意:TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。

TIME-WAIT:时间等待计时器

MSL:最长报文段寿命

为什么A在TIME-WAIT状态必须等待2MSL的时间?

(1)为了保证A发送的最后一个ACK报文段能够达到B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态。

(2)防止“已失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。B只要收到了A发出的确认,就进入CLOSED状态。同样,B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接。B结束TCP连接的时间要比A早一些。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值