基础网络图解|分层 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,通过四元组区分多个客户端),例如 :
notion image
用read0读取从远程计算机传来的数据
用write0向远程计算机写入数据
notion image
notion image
notion image
notion image
notion image
notion image

Nginx

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

资料

Loading...
文章列表
王小扬博客
云原生
Git
Elasticsearch
Apollo
产品
Think
生活技巧
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP
AI