作为前宇宙场的程序员面试官,你猜我在面试中问的最多的是啥? socket 到底是什么?看完这个视频,你不仅能搞清楚概念,还能弄明白 socket 的内核。实现故事要从一个插头说起, 当我将插头插入插座,那看起来就像是将两者连起来了,而插座的英文又叫 socket。 巧了,我们程序员搞网络编程时,也会用到一个叫 sock 的东西,其实两者非常相似,通过 sock, 我们可以与某台机子建立连接。如果我们想要在两端之间传份数据,就需要像上面这样, 两端各自执行 socket 方法。得到 fd 聚柄之后,对于服务端依次执行 bind、 lason、 accept 方法,然后坐等客户端的连接请求。执行 connect 方法,向服务端发起建立连接的请求。连接建立完成后,客户端可以执行 sand 方法发送消息,服务端可以执行 receive 方法接收消息。反过来,服务器也可以执行 send 发送消息,客户端执行 receive 接收消息。这就是我们大部分程序员最熟悉的使用场景。 现在我们见过也用过 socket 了,但对大部分程序员来说,他依然是个黑盒。那既然是黑盒,我们索性假设我们忘了 socket, 重新设计一个内核网络传输功能。网络传输从操作上来看,无非就是两段之间互相收发数据,也就是对应读数据和写数据。 写过代码的都知道,为了实现某些功能,我们一般会需要定一个新的数据结构,这个数据结构叫 sock。 由于接收端和发送端可能不止一个,因此我们加入 ip 和端口坐下区分 ip 用来定位是哪台电脑, 端口用来定位是这台电脑上的哪个进程。另外,发送端和接收端的传输方式有很多区别,可以是可靠的 tcp 协议,也可以是不可靠的 udp 协议,甚至还需要支持基于 icnp 协议的拼命令。虽然这些协议各不相同, 但还是有一些功能相似的地方,比如收发数据时的一些逻辑,完全可以附用按面相对象编程的思想,我们可以将不同的协议当成是不同的对象类或结构体,将公共的部分提取出来,通过继承的方式服用功能。 于是我们将功能重新划分下,定义了一些数据结构。 sock 是最基础的结构,维护一些任何协议都有可能会用到的收发数据缓冲区。 next sock 特指用了网络传输功能的 sock, 在 sock 的基础上还加入了 ttl、 ip、 地址、端口这些跟网络传输相关的自断信息。 说到这里大家就蒙了,难道还有不用网络传输的?有,比如 your next domain socket, 用于本机进程之间的通信,直接读写文件,不需要经过网络协议战。 net connection stop 是指面相连接的 stop, 在 next stop 的基础上加入面相连接的协议里相关自断,比如 accept 队列、数据包、分片大小、握手失败、重试次数等。 虽然我们现在提到面相连接的协议就是指 tcp, 但从设计上, lay next 需要支持扩展其他面相连接的新协议,比如 sctp 协议,不了解也没关系,我们跳过 tcp 下划线 sock 就是正儿八经的 tcp 协议专用的 sock 结构了。在 next connection sock 基础上,还加入了 tcp 特有的滑动窗口、拥塞避免等功能。好了,现在有了这套数据结构,每个数据结构实现自己职责范围内的功能,然后再将它们 硬件网卡对接一下,就实现了网络传输的功能。可以想象到这里面的代码肯定非常复杂,同时还操作了网卡硬件,需要比较高的操作系统权限,再考虑到性能和安全,于是决定将它放在操作系统内盒里。 既然跟远端服务端进程收发数据,可以抽象为读和写,操作文件也可以抽象为读和写。正好有句话叫 lay next 里一切皆是文件,那我们索性将内核的 sock 结构封装成文件就好了。 创建 soc 的同时也创建一个文件,文件有个具柄 fd, 说白了就是个文件系统里的身份证号码,通过他可以唯一确定是哪个 soc。 将 fd 聚柄暴露给用户之后,用户操作这个聚柄文件,系统就会将操作指向内和 sock 结构。有了 socksd 聚柄之后,我们将这部分功能抽象成一个个简单的 api 接口,让用户 更方便的实现特定的网络编唱功能。以后别人只需要调用这些 api 接口,就可以驱动我们写好的这一大堆复杂的数据结构去发送数据。这些 api 接口我们列了一下,发现需要有 send、 receive, bind、 listen、 connect 这些。到这里, 我们的内核网络传输功能就算设计完成了。现在是不是眼熟了,上面这些接口方法其实就是 socket 提供出来的接口,所以说 socket 其实就是个代码库或接口层,它介于内核和应用程序之间,提供了一些高度封装过的接口,让我们去使用内核网络的传输功能。到这里 我们应该明白了,我们平时写的应用程序的代码里,虽然用了 socket 实现了收发数据包的功能,但其实真正执行网络通信功能的不是应用程序,而是 linex。 内核相当于应用程序通过 sock 提供的接口,将网络传输的这部分工作外包给了 linx 内核。这听起来像不像我们最熟悉的前后端分离的服务架构?虽然这么说不太严谨,但看上去 linx 就像是被分成了应用程序和内核两个服务 内核,就像是后端暴露了好多个 api 接口,其中一类就是 soccer, the sand 和 receive 这些方法。应用程序就像是前端负责调用内核提供的接口来实现想要的功能。 看到这里,我担心大家会有点混乱,来做个小的总结。在操作系统内和空间里实现网络传输功能的结构是 suck, 基于不同的协议和应用场景,会被泛化为各种类型的 suck, 他们结合硬件共同实现了网络传输功能。 为了将这部分功能暴露给用户空间的应用程序使用,于是引入了 sak 层,同时将 sak 嵌入到文件系统的框架里。 sock 就变成了一个特殊的文件,用户就可以在用户空间使用文件具柄,也就是 socketfd 来操作内和 salt 的网络传输能力。这个 socketfd 是一个 into 类型的数字,现在回去看 socket 的中文翻译套接字,我将它理解为一套用于连接的数字,是不是就觉得特别合理了? 上面关于 socket 怎么实现网络通信功能这一块一笔带过了,现在我们来聊聊。我们以最常用的 tcp 协议为例,简单了解下它是怎么实现网络传输功能的。 我将它分为两阶段,分别是建立连接和数据传输。在客户端代码执行 socket 提供的 connect 方法,传入 socket 和 ip 端口时, 内核会通过 socksd 句柄找到对应的文件,再根据文件里的信息找到内核的 sock 结构,通过这个 sock 结构主动发起三次握手,至此连接就算准。 准备好了之后就可以开始传输数据了。为了实现发送和接收数据的功能, suck 结构题里带了一个发送缓冲区和一个接收缓冲区。说是缓冲区,但其实就是个链表,上面挂着一个个准备要发送或接收的数据。 当应用执行 send 方法发送数据时,同样也会通过 sockfd 句柄找到对应的文件。根据文件指向的 soft 结构,找到这个 soft 结构里带的发送缓冲区。将数据放到发送缓冲区,然后结束流程内核,看心情决定什么时候将这份数据发送出去。 接收数据流程也类似,当数据送到 linax 内核后,数据不是立马给到应用程序的,而是先放在接收缓冲。剧中数据静静躺着,卑微的等待应用程序什么时候执行。 receive 方法来拿一下,就像我的视频,躺在你的推流列表里,卑微的等一个点赞、关注、转 转发三连。看到这里,问题又来了,服务端类似的时候,那么多数据包发到一个类似 socket 上,服务端是怎么区分多个客户端的?客户端发来的数据包上会有原 ip 地址和端口,以及目的 ip 地址和端口这四个元素构成一个四元组,可以用于唯一标记一个客户端。 服务端会创建一个新的内核 sock, 并用四元组声成一个 hasht, 将它放入到一个 hash 表中。下次再有消息进来的时候,通过消息自带的四元组声成 hasht, 再到这个 hash 表里重新取出对应的 sock 就好了。 所以说服务端是通过四元组来区分多个客户端的。最后遗留一个问题,大家都知道 linx 内核是新语言实现的,而新语言既没有累也没有继承的特性,是怎么做到继承的效果的呢?欢迎评论区讨论。想要文字版的笔记,可到我的报上 回复关键字扫即可获取!老规矩,总结的事情就交给你们了!
粉丝41.6万获赞135.5万


而类似的是一个支持挂在各种网盘的列表程序,网上已经有了非常多的教程,但是那些教程你挂在了自己的网盘以后,你并不能获得大量的资源,而我这个教程可以让你三分钟拥有几百 t 的资源,并且这些资源是动态更新的。先看一下效果, 你可以拥有大量的影视资源和音乐资源,并且还有电子书,综艺软件等等资料,几百 t 的资源已经分类整理好,大家看一下效果。 最后我会和大家分享如何在电脑上像访问本地资源一样去访问这些资源,大家一定要看到视频,最后我会一步一步详细讲解如何实现这样的效果。 最简单的使用方式是打开 小雅,而类似的进入这个主页,你可以直接访问这些资源,演示一下如何使用。你可以在线观看这些影片, 可以打开全屏,这样你不用下载便可以在线观看。点击下面的图标,可以调用电脑本地的视频播放器进行播放, 点下载直接观看十分方便。如果你要下载这个电影也很简单,点击上方切换到下载,复制这个链接,打开下载软件,直接进行下载,可以看到这个下载速度还是很快的。我们在 看一下其他的资源,这里面也汇总了大量的电子书籍,几百贴的内容。如何快速搜索到自己想要的资源呢?很简单,我们点击搜索,点击进入目录, 可以看到资源整理的非常清晰,手机上使用也是完全没有问题的。打开这个网站,选择你要看的电影,点击手机上安装的视频播放器就可以在手机上进行观看了,十分方便。如果你不看四 k 的视频, 直接使用这个网站是完全没有任何问题的,但是当你看四 k 视频的时候,如果发现视频卡顿,你就需要部署自己的小雅俄列斯的程序,因为官方的网站使用的人太多,因此被限速了,自己部署服务以后便不再有网络限速的问题,而且也可以通过 vip dv 的方式 发展到电脑本地,实现这样的效果。部署方式十分简单,登录自己的服务器,使用这个命令自动安装小雅刀客镜像, 我们看一下这个镜像有没有正确的运行。现在这个服务已经运行好了,我们在浏览器上输入 ip, 加上五六七八短口,点击会车 看到这个页面,大家稍等一下,等待存储加载,大约等待一分钟左右。好的,现在所有的内容已经加载好了, 接下来我们替换内置的偷啃,打开这个网页,使用你的阿里云盘扫描二维码,在手机上点击确认登录,下面就是你的偷啃,我们把刚才的偷啃内容粘贴到这个文件中, 点击会车,输入 i, 进入插入模式,复制头啃, ctrl v 按 exc 点输入冒号 x 退出,退出以后需要重启刀壳 刷新页面。现在这个小雅服务便是使用你自己的头啃,不再有网络限速的问题。接下来我们把上面所有的资源挂载到电脑本地 复制链接,大家选择支持 vivodv 下载的软件即可,路径是 ip 加上五六七八端口,后面加上斜杠 dav 用户名和密码,在官网上进行复制粘贴挂载以后我们看一下效果, 我们可以看到他在加载文件夹的时候速度并不是很快,原因有两个,第一个里面的目录非常多,第二个 他的数据是要经过你的服务器,也会受到服务器网速的影响。如果你想要电脑本地使用,最好的方式是在电脑本地上搭载。小雅的服务部署的方式和服务器部署完全相同,现在我在本地上运行了小雅的服务网址, ip 更改为本地, 然后把这个服务挂载到本地部署的参数入下,现在来看一下,加载的速度就快多了。 小雅俄类似的资源在动态更新,资源的种类也越来越丰富,掌握了上面的方法,你便不用为寻找资源而发愁了。影视资源即点即看,电子书和软件可以非常方便的进行下载, 这个动态更新的几百 t 资源库便时刻为你服务。好了,最后希望这个视频能够帮到你,我是格物世间,我们下期不见不散!

本期视频我们继续完成卖 qq 客户端网络部分的实现。首先声明一个类来分装我们的网络功能,其中十八到二十四行完成全局单次的初始化与清理。吸购函数完成 so cat 的自动释放, unit 函数完成针对服务器端的网络初始化。注册函数完成向服务器发送注册请求并获得返回结果。具体的实现 这里用 redp 协议进行初始化,组织数据发送给服务器并获取返回值。 接下来在上期讲解的卖 qq 客户端代码中调用新写的代码,用服务器 ip 地址和端口号进行初始化。在注册功能里面调用我们新写的注册函数测试一下, 先启动已经写好的服务端,在 nf 变异运行我们的客户端输入信息,测试成功。下期我们讲解 linux 下服务端的实现。



介绍一个在知音框架中发挥重要作用的概念,那就是中间键。中间键是一个强大的工具,可以帮助你更好的管理和控制你的外的应用程序。无论是身份验证、日志记录,还是跨越请求,中间键都可以助你一臂之力。 什么是中间键呢?在知音框架中,中间键是一种函数,他可以在请求到达处理程序之前或之后执行,这使得中间键成为处理请求之前的预处理或请求之后的后处理的理想选择。中间键是可重用的,可以轻松的将他们应用于多个端点,以实现一致性和可维护性。 中间键在知音框架中的几个常见用法,例如身份验证中间键。身份验证是许多 web 应用程序的重要组成部分。你可以使用中间键来验证用户是否已登录,以确保只有授权用户可以访问某些 页面或资源,这有助于保护用户的数据和应用程序的安全性。日志记录中间键记录应用程序的活动和请求日志是跟踪问题、监控性能和分析用户行为的重要手段。通过使用中间键,你可以在每个请求之前或之后记录请求和响应的详细信息, 以便后续分析。跨域请求中间键处理跨域资源共享请求是构建现代 web 应用程序式的一个关键问题。 均框架允许你创建自定义中间键来处理 course 请求,确保前端和后端可以安全的进行通信。缓存中间键有时你可能希望缓存响应以提高性能。 通过创建一个缓存中间键,你可以在每次请求到达时检查缓存并返回缓存的响应,而不是每次都重新生成响应。这些只是中间键的一些势力。 你可以根据自己的应用程序需求创建自定义中间键。创建中间键非常简单,只需定义一个函数,他接受 cg context 参数,其中 c 代表了请求的上下文。 你可以在中间键中对请求进行处理,然后使用 c next 来继续请求的处理。总之,中间键是 dream 框架的一个强大工具,可以帮助你管理和控制你的 web 应用程序。无论你需要处理身份验证、记录日志,处理跨域请求还是实现其他功能, 中间键都可以派上用场。希望您现在对中间键的概念有了更深入的了解,可以在你的军营应用程序中充分发挥他们的作用。如果你有任何问题或需要更多帮助,不要犹豫,随时问我。