基础网络图解|分层 TCP Socket
请求流程
- 浏览器请求
- socker到内核
- dns解析
- tcp udp 八万多端口,随机来一个
- ip 源id目标ip
- mac 原mac 目标mac
- 经过路由器层层转发,就到了目标地址,然后反向解析出来
CNI、负载均衡、防火墙、sermash截留
Socket
linux socket 基层 文件
socket本身就是一个文件
五元组(端口(原目)、ip(原目 )、协议)
- socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式Linux中的一切都是文件,为了表示和区分已经打开的文件,UNIX/Linux会给每个文件分配一个ID,这个ID就是一个整数,被称为文件描述符
- 网络连接也是一个文件,它也有文件描述符
- 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接
- 在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了
- 服务端的Accept接收到请求以后,会生成连接FD,借助这个FD我们就可以使用普通的文件操作函数来传输数据了(通过四元组作为唯一标识,生成Hashkey,对应相关socket,通过四元组区分多个客户端),例如 :
用read0读取从远程计算机传来的数据
用write0向远程计算机写入数据






Nginx
- Nginx 所谓的反向代理,实际上只是与后端服务器建立了 Socket B 连接,生成了一个 Socket 对象,Socket 就是一个对象,这个对象可以与操作系统进行通信,操作系统负责发送数据;
- 针对 HTTP 协议的请求,Nginx 也会与浏览器建立一个 Socket A 连接,建立链接之后,接收浏览器发送过来的请求,然后将浏览器的发过来的消息,通过 Scoket B 发送给后端服务器,这个过程有且只有一次,发完后,就只在 Socket B 的 onMessage 函数中等待后端传过来的数据了,一旦后端服务器将结束符\r\n\r\n发过来,则 Nginx 就把这些请求 Close 掉。所以 Http 协议不能支持双向通信。
- 针对 Websocket 协议,Socket A 和 B 都会长时间保持住,同时 onMessage 在没收到 close 报文时都不会主动发起关闭,这样就能让 Websocket协议下进行全双工通信了。
- 至于异步框架是否和 Websocket 有必然关系?可以推测应该不是必然关系,假如 Nginx 和 Django,Django 是同步框架,只要 Django 能按照 Websocket 协议进行发送返回报文,都可以支持双向交互
资料
Loading...