recv

select,poll,epoll最简单的解释

寵の児 提交于 2019-11-28 05:17:09
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道

网络编程

妖精的绣舞 提交于 2019-11-28 04:03:42
网络架构: C/S B/S : C:客户端,B:游览器(rowser),S:服务端 ​ C/S:客户端与服务器之间的架构:QQ,微信,游戏,App都属于cs架构 优点:安全,响应速度快,个性化功能多 缺点:开发和维护成本高,面向客户固定 ​ B/S:游览器与服务器之间的架构: 优点:开发维护成本低,维护成本低,面向的用户广泛 缺点:相对不安全,响应速度相对慢,个性化设计单一 ​ 互联网通讯原理: 打电话示例: 互联网通信: 1,一堆物理介质将两个电话连接起来 2,拨号 3,统一的通信标准,一揽子协议,这些互联网协议就是一个个标准,最终可以通信 ​ 网络五层: osi五层: OSI(Open System Interconnect)开放式系统互联 osi是一个标准,是一个规范,五层协议都是操作系统帮我们封装各种head 应用层 python (应用层包括会话层,表示层) 会话:保证多次网络传输准确性,表示:保证数据安全 ​ 应用层常见协议:HTTP、HTTPS、FTP、SMTP、TELNET、POP3、DNS、DHCP 表示层 数据的表示,安全,压缩,格式有JPEG,ASCII 加密格式等 会话成 建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话 传输层 tcp udp 四层路由器 四层交换机 网络层 路由器 三层交换机 ipv4 ipv6 (国际协议)

day30_步入百万年薪的第三十天——socket套接字(完全版)

隐身守侯 提交于 2019-11-28 01:29:34
day30 基于TCP协议的socket循环通信 server import socket phone = socket.socket() phone.bind(("127.0.0.1", 8080)) phone.listen() conn, addr = phone.accept() from_client_data = conn.recv(1024) print(f"来自客户端的消息:{from_client_data.decode('utf-8')}") conn.close() phone.close() client import socket phone = socket.socket() phone.connect(("127.0.0.1", 8080)) data = input("请输入>>>") phone.send(data.encode("utf-8")) phone.close() 基于TCP协议的socket 链接+循环 通信 代码功能:服务器不会断开,客户端可以断开(且不能输入空字符串) server import socket phone = socket.socket() phone.bind(("127.0.0.1", 8080)) phone.listen(3) while 1: conn, addr = phone.accept()

Linux netstat命令详解

别说谁变了你拦得住时间么 提交于 2019-11-28 01:07:26
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。 输出信息含义 执行netstat后,其输出结果为 Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHEDtcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHEDtcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHEDtcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHEDtcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSEActive UNIX domain sockets (w/o servers)Proto RefCnt Flags

Linux基础命令:netstat

巧了我就是萌 提交于 2019-11-28 00:13:50
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。 输出信息含义 执行netstat后,其输出结果为 Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHEDtcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHEDtcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHEDtcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHEDtcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSEActive UNIX domain sockets (w/o servers)Proto RefCnt Flags

网络编程

会有一股神秘感。 提交于 2019-11-27 22:10:06
1.基本概念 网络通信目的: IP地址 目的:用来标记网络通信中的一台计算机 window查看ip地址: CMD窗口输入命令 ipconfig IP地址的分类: ip v4: 每一个ip地址包括两部分:网络地址和主机地址 常用ip地址:192:168:1~254.1~254 ip v6(正在发展) 单播:一对一 多播:一对多 端口:就是一个数字,标记进程,好比就是一个房子的门,是出入这间房子的必经之路 端口分类:知名端口 动态端口 端口是通过端口号来标记的,端口号只有整数,范围是从0到65535 知名端口:是众所周知的端口号,范围从0到1023,不能随便用 80端口分配给HTTP服务 21端口分配给FTP服务 动态端口:范围1023~65535,一般不固定分配某种服务,而是动态分配的,可以随便用 进程:是运行起来的程序。 socket(套接字,类似于插口,插排) socket是网络通信必备的,如常见的网络通信工具,qq,微信 1.创建一个tcp sokect(tcp套接字) import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.close() 2.创建一个udp socket(udp套接字) s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s

基于TCP和UDP的socket

匆匆过客 提交于 2019-11-27 21:25:04
为什么学习socket   你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的内容,对吧,但是那么突然有一天,你的朋友和你说:"把你电脑上的一个文件通过你自己写的程序发送到我的电脑上",这时候怎么办?你是不是会想,what?这怎么搞?就在此时,突然灵感来了,我可以通过qq、云盘、微信等发送给他啊,可是人家说了,让你用自己写的程序啊,嗯,这是个问题,此时又来一个灵感,我给他发送文件肯定是通过网络啊,这就产生了网络,对吧,那我怎么让我的程序能够通过网络来联系到我的朋友呢,并且把文件发送给他呢,那么查了一下,发现网络通信通过socket可以搞,但是怎么搞呢?首先,查询结果是对的,socket就是网络通信的工具,也叫套接字,任何一门语言都有socket,他不是任何一个语言的专有名词,而是大家通过自己的程序与其他电脑进行网络通信的时候都用它。知道为什么要学习socket了吧朋友们而你使用自己的电脑和别人的电脑进行联系并发送消息或者文件等操作就叫做网络通信。 三 C/S架构,B/S架构 客户端英文名称:Client, 浏览器英文名称:Browser. 服务端英文名称:Server,C\S架构就是说的Client\Server架构,B\S架构就是说的Browser

python利用socket传输文件

て烟熏妆下的殇ゞ 提交于 2019-11-27 21:17:36
今日单词 socket 插座 套接字 少开的 phone 手机 server 服务器 少我 bind 捆绑 client客户 可来嗯 accept 接受 阿婆晒的 addr conn connect 接受 recv 接收 send 发送 decode解码 encode编码 total 全部的 偷偷 size 大小 塞子 result 结果 内稍ci ipconfig 微软操作系统中的一个系统命令,用于查看本机的IP信息 ipconfig/all查看当前电脑网卡的ip信息、DNS信息、DHCP服务器信息等 import subprocess 子过程可以执行远端命令 import struct结构 是不的 将该模块可以把一个类型,如数字,转成固定长度的bytes pack包装 怕可 unpack 打开包裹 粘包现象 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了       2.客户端没有粘,可能是在服务端粘了 socket收发消息的原理 所谓粘包问题主要还是因为接收方不知道消息之间的界限 还有系统缓存区的问题 时间差的原因,不知道一次性提取多少字节的数据所造成的。 为什么要有缓存区 输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:1024字节=1k 缓冲区的作用? 存储少量数据

socket基于TCP(粘包现象和处理)

你说的曾经没有我的故事 提交于 2019-11-27 21:17:17
目录 6socket套接字 7基于TCP协议的socket简单的网络通信 AF_UNIX AF_INET (应用最广泛的一个) 报错类型 单一 链接+循环通信 远程命令 9.tcp 实例:远程执行命令 10.粘包现象 11.操作系统的缓存区 1.为什么出现粘包 12.什么情况下出现粘包 1.出现粘包的情况 2.收发的本质 13.low解决粘包现象 14.recv工作原理 15.高大上版 解决粘包方式(自定制包头) 6socket套接字 socket网络套接字 什么是socket 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 ​ sock是处于应用层和传输层之间的抽象层,1他是一组操作起来非常简单的接口(接收数据)此接口接收数据之后,交由操作系统 为什么存在socket抽象层 如果直接与操作系统数据交互非常麻烦,繁琐,socket对这些繁琐的操作高度的封装和简化 socket在python中就是一个模块。 7基于TCP协议的socket简单的网络通信 import socket server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 一对一 简单的socket抽象层 定义一些简单的接口 留下一个接口 1.socket处于应用层和传输层之间,提供了一些简单的接口,避免与操作系统直接对接

【TCP】tcp协议通信中io

烂漫一生 提交于 2019-11-27 20:41:19
阻塞IO recv,接收数据,若没有,将阻塞, 当对方发数据来后,linux内核缓冲区得到数据, 内核数据复制到recv()调用所在的用户空间, 阻塞解除,进行下一步处理, 非阻塞IO 轮询调用recv函数接收数据, 没有数据,立即返回,然后继续调用, 根据返回值来判定时候读到数据, 这种方式大量消耗CPU,应用范围小,一般和selectIO复用配合使用, IO复用 select机制,可以轮询多个fd的状态变化, 进而决定recv是否要进行数据的读,而不致像上面两种极端, 但是所轮询的多个fd都没有状态变化,也将阻塞, 同时select也可以设置等待时间,避免干等, 信号驱动IO 建立一个信号,当有数据到来的时候,通知上层应用去读取数据, 这种模型用的较少,信号发送有延迟,处理数据有延迟,内核数据也可能发生变化,   为什么说信号驱动的延迟大呢?   因为有数据了,得发送一个信号去通知上层应用,   通知之后,不一定马上来读取,   有机会读取了,还得跑过来读 异步IO 异步IO,上层应用提供了一个应用层的缓冲区, 有数据了,内核会主动,,的把数据塞到应用层提供的这个缓冲区,而不用像上面那样有那么的工序去主动地读,不过这个复杂工序你暂时没办法了解很深入,但是可以肯定的是,主动读肯定涉及到很多过程处理, 来源: https://www.cnblogs.com/itplay/p