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

参加比赛没表现好,被批了一顿。摆烂了很久,都不好意思写技术博客了。现在感觉,反正开摆了就做点想做的事吧,顾虑那么多干啥,矛盾。于是又来臭不要脸地写博客了。
说回博客主题,说实话我对这方面的东西也不是很懂。学校计网讲得也不是很清楚,主要是面向考试。所以这篇东拼西凑凑出来的笔记很可能是有问题的,欢迎各位读者大大指出。
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源码放在文末)
使用TCP和UDP两个不同协议的Socket是可以共用端口的。
使用UDP协议的Socket可以自己给自己发消息。
那么就先到这吧,以后随缘更新。
源码
结论1的源码
输出结果
结论2的源码
输出结果