当UDP协议客户端给TCP协议服务器发数据会发生什么

Posted 氵焱焱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当UDP协议客户端给TCP协议服务器发数据会发生什么相关的知识,希望对你有一定的参考价值。

咱先试试正常的TCP与TCP的通信

使用Wireshark去抓ubuntu中我自己写的一个局域网服务器的包

可以看到三次握手四次挥手 以及 传输数据与ACK应答的过程

 

那么  当TCP服务器与UDP通信 会发生什么呢

 

 可以看到 TCP服务器终端这边没有任何的相应(因为TCP服务器这里在accept那阻塞)

但是UDP客户端里还是收到了来自服务器ip地址的回信 回信协议就是ICMP 该回信回复了该消息不可到达

但是 既然服务器正在accept阻塞 我的代码此时也没有开多进程多线程 那么是谁在给UDP客户端发送错误 

答:服务器主机或者路由器发送的ICMP,ICMP是一个网络层协议,他被用于路由器或主机的控制消息,而这里发给该UDP协议的消息为“数据没有被送达”

又有新的问题了 我在该UDP上已经指定了接收端的IP以及端口 也都正确,为什么会没有送达呢?

答:TCP与UDP因为协议不同 使用的端口实际上也不同 尽管他们的数字都是相同的

通过解包该ICMP包 我们能看到Type为3 Code为3

对照ICMP消息类型表可知:

 实际上产生不可到达的错误的真实原因 居然真的不是协议不可到达 而是端口不可达

 

那么我在很短的时间内 不断地用UDP客户端发数据给TCP服务器会怎么样可以看到 主机只发送了一次ICMP包

因为ICMP同样有承担着防御、抵制攻击的功能 如果有个坏蛋就不断的用错误信息给服务器发送数据,每次错误ICMP都回复一次,那么主机将会浪费大量的CPU资源在此上面,主机卡死只是时间的问题。

 

以上是关于当UDP协议客户端给TCP协议服务器发数据会发生什么的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb

TCP/IP 协议图--传输层中的 TCP 和 UDP

UDP通信

网络编程-socket之TCP协议开发客户端和服务端通信

TCP与UDP比较 以及并发编程基础知识

httpRMIsocketrpchessian比较