为什么说tcp区分服务端和客户端,而udp不区分(个人理解)

前言

首先要说明的一点是从编程角度出发,服务端和客户端的代码肯定是有一些区别的,不论是tcp还是udp,标题的这种说法只是一种宽泛的理解。

在还没仔细了解之前tcp/ip协议栈之前总是听到这样的言论 tcp区分服务端客户端啊,但是udp不会 。最近研究了一番tcp/ip协议栈之后发现很多博客在介绍tcp,udp协议时也并未提到这种观点,那么这种说法是怎么来的呢?以下是我一些简单的理解。

tcp udp 编程时的区别

在客户端编程中,tcp和udp几乎没有差别,唯一明显的区别可能是tcp在send和recv时无需指定地址了(其实这也是标题说法的一种体现,这里先不展开谈)。

在服务端编程中,tcp和udp区别就大了。udp在服务端只是需要注意保存对方端的ip和端口号,但是tcp就复杂了很多,包括需要先创建一个套接字来监听指定端口,然后不断循环accept新的连接等等。

你可能会问,为什么udp端不需要专门创建一个套接字来监听指定端口,和tcp差不多得搞法,tcp不过只是一个复杂些的udp嘛。但其实这就涉及到了tcp和udp最大的区别———连接状态

udp无连接性

对于udp服务端来说,如果也搞成tcp那样,那就太没必要了。

tcp在建立连接是需要三次握手,结束时需要四次挥手,以此宣示一个完整的连接过程。而udp就简单多了,指定地址直接发送过去就完事了,不管对面接不接收到。

正是由于这种特性,对于udp来说,换一个连接就是换一个地址发送的事,而tcp就得四次挥手再三次握手再能切换到新的连接。这也是上文说的为什么tcp调用send和recv方法无需指定地址的原因,对于tcp来说,连接更有种session的意味在,在本次连接中,当然就是一直发送接收对端的包啦,何必每次都说明一下。所以对于tcp的服务端来说,必须得有一个连接队列来存储与客户端们建立好的连接,还有一个套接字来专门获取这个队列中的连接,而udp的服务端只要从接收缓冲区中拿出接收到的包,发给对端就可以了,因为对于udp来说就是换一个地址send而已,它不关心此次发送会不会成功。

总结

对于udp来说,发送接收更像是你一下我一下的,你很难从中这个行为看出谁是服务端谁是客户端,而tcp连接是一段一段的,管理多段的一端当然是服务端。

这里有一个回答也是关于这个话题,我觉得说得不错:UDP服务端和UDP客户端的区别?

猜你喜欢

转载自blog.csdn.net/weixin_55658418/article/details/127908187