socket知识点小记

Preview

我们在用c/c++编写网络程序时,基本步骤是:获取一个socket、bind、listen、accept、read、write(Linux系统下),用起来很方便但是我也有很多的疑惑

  1. socket到底是什么,他是属于网络通信的哪一层呢
  2. bind是做了啥操作
  3. accept为啥会重新返回一个socket,接下来我们的操作会基于这个新的socket操作
  4. http和RPC这种东西是个啥

Socket

在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket,这个socket类似于文件句柄,放在句柄表中,调用socket()这个函数会返回一个int类型的值,这个值其实就是这个文件句柄
在句柄表中的索引,句柄这个词在Linux中特别常见,其就是用来表示某个对象的,简单理解成对象指针~~

大家都知道tcp/udp,但是我们在编程的时候并不会过多的涉及到它们(主要是在socket()这个系统函数中设置),这主要归功于socket对于这些东西的封装,这里提一句socket比tcp/udp早
出现很多年~~,所以socket其实是对tcp/udp的一层封装,我感觉他不属于那一层而是传输层和应用层的接口封装,socket将tcp/udp的复杂操作封装成了bind、listen等几个函数

bind

在我们创建了一个socket,并将其和地址端口bind之后listen,其实就是向tcp/udp协议栈(这里应该说是协议栈的具体实现)声明对于这个端口我这个socket承包了,以后所有的请求给我处理,
同时别的socket不准来用我的

accept

accept函数就是一个建立连接的过程,就是那个三次握手四次挥手那个,accept会阻塞式的等待新的连接到来并和其建立连接,返回一个新的socket号,为啥会返回一个新的呢,你想想一个端口肯定会同时
处理很多很多的请求如果不是新生成一个,那岂不是要一个一个的阻塞式处理,太低效了~~,socket中会包含源ip+端口和目的ip+端口,这些新生成的socket的目的ip+端口是相同的,不然在防火墙的时候会乱套
至于为啥自己想

应用层协议

http是应用层最流行的协议(应该是吧),协议其实就是规定了数据的组织格式和解析方法(语法+语义太抽象,直接这样简单理解吧),比如http协议的数据格式如下图(网上借的):

v2-12836e928e97f0d1acf375b34981a071_r.jpg

对于我们上层程序员来说,我们能拿到的数据就是从socket中read出来的,按照上面的格式逐一解析出请求的内容,并进行对应的处理,返回对应的数据

所以这里可以简单的描述一下python的web架构,主要有三层加一协议组成:webserver、web框架、用户自己的App + wsgi协议
webserver:主要负责启动网络监听进程,将请求内容进行解析并封装成符合wsgi规范的数据格式
web框架:比如Django这种,其实就是提供了很多很多工具,简化了开发步骤,比如与webserver的对接,路由的转发,配置的管理等等
App:这里才是我们需要编写程序的地方,框架根据请求path将请求路由到你的App,在这里进行你想要的数据处理,比如返回文件数据
wsgi:这个是webserver和web框架通信的格式规范,典型的分层设计~~

RPC也是应用层协议(基于5层模型,毕竟是事实标准),反正网络不管咋搞传输层及之前的层是必须要经过的
RPC的操作和Http差不多,也是监听,建立链接,拿到请求数据,但是之后的处理会不一样~~,具体细节看:https://zhuanlan.zhihu.com/p/187560185
总的来说就是:客户端将要调用的方法和参数组装序列化,传到服务端,服务端将数据反序列化拿到要调用的函数很参数,然后执行该函数,将过程执行的结果以反方向的相同步骤响应给客户端

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容