Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)。...) # ...这里是使用套接字的功能(省略)...# 不用的时候,关闭套接字 s.close() 创建一个udp socket(udp套接字): import socket # 创建udp的套接字 s = socket.socket(socket.AF_INET..., socket.SOCK_DGRAM) # ...这里是使用套接字的功能(省略)... # 不用的时候,关闭套接字 s.close() 说明: 套接字使用流程与文件的使用流程很类似: 创建套接字 使用套接字收发数据...关闭套接字
mmap 是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。...,将内核缓冲区映射到用户缓存区; DMA 控制器将数据从硬盘拷贝到内核缓冲区(可见其使用了 Page Cache 机制); mmap() 返回,上下文从内核态切换回用户态; 用户进程调用 write()...,尝试把文件数据写到内核里的套接字缓冲区,再次陷入内核态; CPU 将内核缓冲区中的数据拷贝到的套接字缓冲区; DMA 控制器将数据从套接字缓冲区拷贝到网卡完成数据传输; write() 返回,上下文从内核态切换回用户态...分析:因为单位物理页面的大小是4096字节,虽然被映射的文件只有5000字节,但是对应到进程虚拟地址区域的大小需要满足整页大小,因此mmap函数执行后,实际映射到虚拟内存区域8192个 字节,5000~...将多个文件映射到内存中会使这个问题更加复杂。 不适合的场景 您希望从开始到结束的顺序从头到尾读取一个文件 这个文件有几百兆字节或者更大。
POSIX兼容的系统上,例如Linux系统,I/O操作可以有多种方式,比如DIO(Direct I/O),AIO(Asynchronous,I/O 异步I/O),Memory-Mapped I/O(内存映设...在UNIX系统中,I/O输入操作(例如标准输入或者套接字的输入)通常包含以下两个不同的阶段: 等待数据准备好 从内核向进程复制数据 3. UNIX 下的 IO 模型 3.1....默认情况下,所有套接字都是阻塞的,如下图所示: 这样的IO模型中,系统调用会从应用进程空间切换到内核空间中运行一段时间后再切换回来。...select 调用等待数据报套接字变为可读,然后调用真正的IO系统调用去进行IO操作,将所读的数据写入应用程序缓冲区中。
image.png Linux进程间通信的方式: 管道(Pipe)、信号(Signal)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket、中断 Binder...优点: 1、安全,传统的IPC(套接字、管道、消息队列)的安全机制依赖上层协议;例如: a、Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。...2、性能高:传统的IPC(套接字、管道、消息队列)需要拷贝两次内存、Binder只需要拷贝一次内存、共享内存不需要拷贝内存。...当多个进程需要同时访问同一个文件时,每个进程都将文件所存储的内核高速缓冲映射到自己的进程地址空间。...内核将文件的这一页数据读入到内核高速缓冲区中,并更新进程的页表,使页表指向内核缓冲中的这一页。
套接字是通过地址簇和套接字类型两个主要属性来控制如何发送数据。...()设置套接字的阻塞或非阻塞模式sock.gettimeout()获取阻塞套接字操作的超时时间面向文件的套接字方法sock.fileno()套接字的文件描述符sock.makefile()创建与套接字关联的文件对象数据属性...()将一个主机名映射到它的IP地址gethostbyname_ex()gethostbyname()扩展版本,返回主机名、别名主机集合和IP地址列表gethostbyaddr()将一个IP地址映射到DNS...信息,返回与gethostbyname_ex()相同的三元组getprotobyname()将协议名映射到一个数字getservbyname()将服务名映射到一个协议名getservbyport()将服务名映射到一个端口号...为了保障数据的可靠传输,会对从应用层传送到TCP实体的数据进行监管,并提供了重发机制和流控制。 TCP工作原理 TCP是如何保障数据可靠不丢失且有序呢?
eBPF虚拟机更类似于现代的处理器,允许eBPF指令映射到更贴近硬件的ISA以获得更好的性能。最显著的变化之一是转向使用64位寄存器,以及提升使用寄存器数量,从2个增加到10个。...由于eBPF的起源,它特别适合编写网络程序,并且可以编写程序,附加到网络套接字来过滤流量,对流量进行分类,并执行网络分类器动作。甚至可以使用eBPF程序修改已建立的网络套接字的设置。...BPF_PROG_TYPE_LWT_*: 用于轻量级隧道的网络数据包过滤器 BPF_PROG_TYPE_SOCK_OPS: 一个用于设置套接字参数的程序 BPF_PROG_TYPE_SK_SKB: 一个用于套接字之间转发数据包的网络包过滤器...,并允许使用BPF帮助函数进行套接字重定向 可以使用bpf_map_lookup_elem()函数和bpf_map_update_elem()函数从eBPF程序或用户空间程序访问所有map对象。...某些map类型,如套接字类型map,它是与那些执行特殊任务的eBPF帮助函数,一起工作。
SELECT a.id as lang_id, a.name as name, b.cnt as cnt FROM programming_lang a...
1.2.套接字分类 这个世界上有很多种套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25...1.4.无连接套接字 数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。...因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。...总之,数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字。...TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。
2.零字节拷贝 传统数据从文件传到套接字的路径 ?...一般的将数据从文件传到套接字的路径: 1.操作系统将数据从磁盘读到内核空间的页缓存中 2.应用将数据从内核空间读到用户空间的缓存中 3.应用将用户空间数据写回内存空间的套接字缓存中 4.操作系统将数据从套接字缓存写到网卡缓存中...三、虚拟内存 1.虚拟内存好处 1.一个或者多个的虚拟地址可以指向同一个物理内存地址 2.虚拟内存空间可大于实际可用的硬件内存 下图用户空间和内核空间地址映射到同一个物理内存地址 ?...把内核空间地址与用户空间的虚拟地址映射到同一个物理地址,可以省去内核与用户空间拷贝,前提条件为: 1.内核与用户缓存区必须使用相同的页对齐 2.缓冲区的大小需磁盘控制器块大小(通常512字节)的倍数 3...当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常,进而进入内核空间分配物理内存、更新进程缓存表,最后返回用户空间,恢复进程运行。
Netlink套接字 netlink_route_socket 用于控制和管理网络资源如路由表和IP地址的Netlink套接字 netlink_selinux_socket 用于接收策略载入通知,强制模式切换和清空...AVC缓存的Netlink套接字 netlink_tcpdiag_socket 用于监视TCP连接的Netlink套接字 netlink_soecket 所有其它的Netlink套接字 netlink_xfrm_socket...既不是 TCP 也不是 UDP 的 IP 套接字 tcp_socket TCP 套接字 udp_socket UDP 套接字 unix_dgram_socket 本地机器上(unix 域)的 IPC...套接字、文件和进程在 SELinux 中都有标签。...对象会映射到类,对每个类的不同访问类型由权限表示。 域(domain):一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
multiprocessing.SharedMemory 会产生数据竞争,不应该直接使用,应该使用 multiprocessing.Value 和 multiprocessing.Array 这种更高层的抽象 套接字...以太网套接字 也就是我们跨网络使用的tcp/udp Unix域套接字 当同一个机器的多个进程使用普通套接字进行通信时,需要经过网络协议栈,这非常浪费,因为同一个机器根本没有必要走网络。...所以Unix提供了一个套接字的特殊版本,它使用和套接字一摸一样的api,但是地址不再是网络端口,而是文件。相当于我们通过某个特殊文件来进行套接字通信。...无名套接字socketpair Unix系统提供了无名套接字socketpair,不需要端口也可以创建套接字,父子进程通过socketpair来进行全双工通信。...跟unix域套接字的区别是,不需要创建socket文件并绑定监听。 socketpair返回两个套接字对象,一个用于读一个用于写,它有点类似于pipe,只不过pipe返回的是两个文件描述符,都是整数。
这样就可以不用read和write的情况下执行io 文件映射到存储区: ?...网络进程间通信:套接字 1. 套接字描述符 套接字是通信端点的抽象,是用文件描述符实现的 创建套接字描述符: ? domain:套接字域 ? type:套接字类型 ?...将主机名和服务名映射到一个地址 ? 地址信息包含的成员 ?...accept获得连接请求,并建立连接 返回的文件描述符是套接字描述符,描述符连接到调用connect到客户端 新的套接字描述符和原始套接字sockfd具有相同的套接字类型和地址族 传给accept的原始套接字没有关联到这个连接...套接字选项 5.1 套接字选项包括 通用选项,工作在所有套接字类型上 在套接字层次管理的选项,但是依赖底层协议的支持 特定与某种协议的选项,为某个协议独有 5.2 设置套接字的函数 ? 6.
共享内存区是最快的可用IPC形式,一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再通过执行任何进入内核的系统调用来传递彼此的数据,节省了时间。...本地套接字 进程间通信的一种方式是使用UNIX套接字sockaddr_un,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。本地套接字用于本地进程间的通讯更安全和稳定。...使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。...不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。...本地套接字的其他操作都与网络套接字相似。
send()调用导致上下文从用户态切换到内核态。第三次拷贝数据从用户空间重新拷贝到内核空间缓冲区。但是,这一次,数据被写入一个不同的缓冲区,一个与目标套接字相关联的缓冲区。...在UNIX和Linux系统中,调用这个方法会引起sendfile()系统调用,实现了数据直接从内核的读缓冲区传输到套接字缓冲区,避免了用户态(User-space) 与内核态(Kernel-space)...使用NIO零拷贝,流程简化为两步: transferTo方法调用触发DMA引擎将文件上下文信息拷贝到内核读缓冲区,接着内核将数据从内核缓冲区拷贝到与套接字相关联的缓冲区。...DMA引擎将数据从内核套接字缓冲区传输到协议引擎(第三次数据拷贝)。 内核态与用户态切换如下图: ?...数据不会被拷贝到套接字缓冲区,只有数据的描述符(包括数据位置和长度)被拷贝到套接字缓冲区。DMA 引擎直接将数据从内核缓冲区拷贝到协议引擎,这样减少了最后一次需要消耗CPU的拷贝操作。
ContentHandlerFactory 作用 : 定义内容处理程序工厂, 该接口的实现类 负责 将 MIME 类型映射到 ContentHandler 实例对象中; MIME 解析 : -- 扩展名...DatagramSocketImplFactory 作用 : 定义用于数据包套接字实现的工厂; 接口使用环境 : DatagramSocket 使用该接口的方法 创建 套接字实例; 接口方法解析 : ...SocketImplFactory 作用 : 用于定义套接字实现工厂; 使用环境 : Socket 和 ServerSocket 使用该接口定义的方法 来创建套接字实例; 方法解析 : SocketImpl...; -- 套接字本地地址不可更改 : 套接字在创建的时候绑定本地地址, 因此不可更改; -- 套接字默认地址 : INADDR_ANY 表示 多穴主机 (有多个IP地址的主机) 的任何地址; SO_REUSEADDR...(send): 设置 网络 输出 的 用到的基础的IO缓冲区大小提示; -- 设置方法使用 : 设置通过套接字 发送数据 时使用的缓冲区的大小; -- 获取方法使用 : 获取套接字设置的 发送数据 缓冲区大小
netstat命令 netstat命令显示各种网络相关信息,例如网络连接、路由表、接口统计信息、伪装连接、多播成员身份等。...--route, -r: 显示内核路由表,netstat -r和route -e产生相同的输出。 --groups, -g: 显示IPv4和IPv6的多播组成员身份信息。...-a, --all: 显示监听和非监听套接字,使用--interfaces选项显示未启动的接口。 -F: 从FIB打印路由信息,这是默认设置。 -C: 从路由缓存中打印路由信息。...ESTABLISHED: 套接字已建立连接。 SYN_SENT: 套接字正在积极尝试建立连接。 SYN_RECV: 从网络接收到连接请求。 FIN_WAIT1: 套接字已关闭,连接正在关闭。...FIN_WAIT2: 连接已关闭,套接字正在等待从远端关闭。 TIME_WAIT: 套接字在关闭后正在等待处理仍在网络中的数据包。 CLOSE: 没有使用该套接字。
从进程的角度来看,也许最重要的是在使用这些系统调用时如何引用网络。在Unix系统中,进程使用套接字来识别它何时以及如何与网络通信。...例如,TCP连接由流套接字(SOCK_STREAM,从程序员的角度看)表示,而UDP连接由数据报套接字(SOCK_DGRAM)表示。...请注意,这种服务器涉及两种套接字:监听套接字和用于读写的套接字。主进程使用监听套接字查找来自网络的连接。...,我们在第 3 章中简要介绍过,称为 Unix 域套接字当一个进程连接到一个 Unix 域套接字时,它几乎与网络套接字的行为完全相同:它可以在套接字上监听并接受连接,甚至可以选择不同类型的套接字来使其表现得像...而且 Unix 域套接字不必绑定到套接字文件上。一个进程可以创建一个未命名的 Unix 域套接字,并与另一个进程共享地址。
抛弃HTTP以获得更合适的东西 在发出HTTP请求并接收响应时,涉及的实际双向网络通信通过活动的TCP / IP套接字进行。...Connection标头告诉服务器客户端希望协商套接字使用方式的更改。 随附的值Upgrade表示当前通过TCP使用的传输协议应该更改。...要完成握手,请将适当的HTTP响应头写入客户端套接字。...尽管注册表是将子协议名称映射到其解释的规范来源,但唯一严格的要求是客户端和服务器就其相互选择的子协议实际意味着什么达成一致,无论它是否出现在IANA注册表中。...扩展可能发挥作用的另一个例子是多路复用 - 使用单个套接字来交错多个并发通信流。 WebSocket扩展是一个有点高级的主题,并且超出了本文的范围。
现在,这些指标是在套接字级别收集的,这意味着它们正是应用程序进程可以看到的内容。收集是通过 eBPF 探针完成的,因此第一个想法是检查操作系统内核是否比套接字中可用的信息更了解应用程序连接。...蓝色圆圈是在套接字中观察到的本地地址,紫色的则是远程地址。这个挑战就是要关联紫色和蓝色。...理想的位置是网络堆栈中内核中的某个位置,它位于所谓的套接字缓冲区(表示网络连接信息的结构)中,从顶级一直到准备好通过网络传输的数据包。从实现的角度来看,代码应该是 eBPF 代码(当然!)...Sock ops 程序是附加到 cgroup v2 的一种单一函数,允许仅针对某些套接字启用它(例如,属于特定容器)。程序接收到单个操作,用于指示套接字的当前状态。...首先,我们需要一种从 BPF 映射中删除旧记录的方法。执行此操作的最佳时机是 conntrack 模块从其表中删除连接时。
这意味着,客户端进行connect调用后,该套接字一定被加入到某个表中,并可以被匹配到。...跟踪内核源码tcp_v4_connect->inet_hash_connect->__inet_check_established,可以看到当调用connect时,对应的套接字就被加入了全局的tcp已连接的表中...对应的匹配TCP套接字过程,如下__inet_lookup_skb->__inet_lookup ? 内核是先在已经连接的表中查找,再进行listen表的查找。...对于客户端来说,syn+ack报文必然可以在已连接表中匹配上对应的套接字。那么,对于本题目来说,要想两端都可以找到套接字,就要求在报文到达前,两端都调用了connect。...从截图中,可以看到TCP套接字成功的“连接”了自己,并发送和接收了数据包围。netstat的输出更证明了TCP的两端地址和端口是完全相同的。
领取专属 10元无门槛券
手把手带您无忧上云