欢迎光临散文网 会员登陆 & 注册

对Socket、UDP和TCP相关内容的学习笔记(一)

2022-04-15 01:22 作者:Zerous  | 我要投稿

参加比赛没表现好,被批了一顿。摆烂了很久,都不好意思写技术博客了。现在感觉,反正开摆了就做点想做的事吧,顾虑那么多干啥,矛盾。于是又来臭不要脸地写博客了

说回博客主题,说实话我对这方面的东西也不是很懂。学校计网讲得也不是很清楚,主要是面向考试。所以这篇东拼西凑凑出来的笔记很可能是有问题的,欢迎各位读者大大指出。

Socket是什么?

很简单,查字典就知道了。是插座!啊不对,是套接字!

曾经在知乎看到Invalid s佬在一篇关于API设计的回答里提到过Socket的设计思路。

按他的描述来看,Socket API把对客户端的Socket抽象成了“网线插头”,把底层协议抽象成了“虚拟网线”:

通过connect函数来把插头插到对应的插座。期间可以通过read或write来发送或者接收消息。最后调用close函数拔掉插头。

而对服务端的Socket则是抽象成了“网线插座”:用bind来定好插座,然后listen来处理连接请求。然后accept连接请求来建立一个专线。

感觉讲得挺好我就在这照搬了。就像把OpenGL理解成一个排满开关然后留有几个插件接口的巨大机器;把Mentle-like API理解成拼装一个制作图片的流水线一样。感觉学习这种东西的时候,在脑子里类比/模拟出来一个模型更能加深理解。

最后补充一下私货。我认为Socket和OpenGL、DX等一众图形API是类似的,是一种约定(也许应该叫协议?)。各个厂商心照不宣做出来的一个网络接口,虽然看起来差不多但总在一些小细节上会有点点区别的感觉。

端口又是什么?

我在开始打算写这个文章之前,我甚至都没产生过这样的疑问。在之前我一直以为一个Socket连接对应的就是一个端口。重新思考TCP之后才意识到可能端口和Socket并不是一一对应的。

在查找资料时,看到资料中的描述是:一个指定的端口号不能被多个应用程序共用。那么在一个应用程序里面就可以共用一个端口号吗?TCP应该是可以的。TCP和UDP两个不同的传输层协议是否可以共用一个端口号呢?

为此,我编写了程序做了点比较糙的实验。得到了一些结论。(Rust源码放在文末)

  1. 使用TCP和UDP两个不同协议的Socket是可以共用端口的。

  2. 使用UDP协议的Socket可以自己给自己发消息。

那么就先到这吧,以后随缘更新。

源码

结论1的源码

输出结果

结论2的源码

输出结果


对Socket、UDP和TCP相关内容的学习笔记(一)的评论 (共 条)

分享到微博请遵守国家法律