套接字

高性能网络编程(一)----accept建立连接

一笑奈何 提交于 2019-11-29 21:39:31
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。 编 写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发 的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件 参数来达到目的。学习复杂的通讯框架、底层细节,在习惯于使用OO语言的程序员眼里是绝对事倍功半的。以上做法无可厚非,但有一定的局限性,本文讲述的网 络编程头前冠以“高性能”,它是指程序员设计编写的服务器需要处理很大的吞吐量,这与简单网络应用就有了质的不同。因为:1、高吞吐量下,容易触发到一些 设计上的边界条件;2、偶然性的小概率事件,会在高吞吐量下变成必然性事件。3、IO是慢速的,高吞吐量通常意味着高并发,如同一时刻存在数以万计、十万 计、百万计的TCP活动连接。所以,做高性能网络编程不能仅仅满足于学会开源组件、中间件是如何帮我实现期望功能的,对于企业级产品来说,需要了解更多的 知识。 掌握高性能网络编程,涉及到对网络、操作系统协议栈、进程与线程、常见的网络组件等知识点,需要有丰富的项目开发经验,能够权衡服务器运行效率与项目开发效率。以下图来谈谈我个人对高性能网络编程的理解。 上面这张图中

Linux下5种IO模型以及阻塞/非阻塞/同步/异步区别

混江龙づ霸主 提交于 2019-11-29 19:29:34
1. 引言 同步(synchronous) I/O和异步(asynchronous) I/O,阻塞(blocking) I/O和非阻塞(non-blocking)I/O分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous I/O和non-blocking I/O是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network I/O。 本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”,Stevens在这节中详细说明了各种I/O的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。本文中的流程图也是截取自参考文献。 Linux下的五种I/O模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 和poll) (I/O multiplexing) 信号驱动I/O

socket套接字

核能气质少年 提交于 2019-11-29 19:20:13
一、用套接字实现简单通信 1.1服务端 import socket soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定IP地址和端口号 soc.bind(('192.168.11.195',8080)) #处于监听状态 soc.listen(5) #准备接收数据 conn,addr = soc.accept() #接收数据,最大为1024字节 data= conn.recv(1024) # 打印客户端发来的信息 print('客户端发来的数据:',data) #发送信息 conn.send(b'sjdiuamjnd') # 关闭通信 conn.close() #关闭连接 soc.close() 1.2 客户端 import socket soc = socket.socket() #连接IP地址和端口号 soc.connect(('192.168.11.195',8080)) #发送消息 soc.send(b'adndhbv') #接收1024个字节 data = soc.recv(1024) #打印接收的数据 print('服务端接受的数据:',data) #关闭连接 soc.close() 二、用套接字实现通信循环 由于简单通信,客户端和服务器发一次数据就端来连接了,我们现在要用一种方法让他实现

【网络】第二章-套接字编程

≡放荡痞女 提交于 2019-11-29 19:04:33
套接字编程   套接字编程也叫 Socket 编程。这个章节将总结和归纳Linux操作系统下如何利用系统接口进行网络编程。 网络字节序   之前有讲过字节序这个概念,不同的主机往往有着不同的数据存储协议,分为大端以及小端两种,但既然是网络通信,不同主机之间就必须要统一规定一个字节序来规定数据传输方式,这个就被称为 网络字节序 。 系统接口    传输层协议   网络通信是两端通信,客户端与服务端。主动发起请求的是客户端,被动接受请求的一段是服务端。永远是客户端先向服务端发送数据。通信中数据需要经过层层封装,每一层都有典型协议,但是传输层有两个协议,TCP/UDP协议。 协议特点   TCP协议特点:传输控制协议, 面向连接,可靠传输,提供字节流传输服务 。   UFP协议特点:用户数据报协议, 无连接,不可靠,面向数据报 。   TCP为了保证可靠传输牺牲了性能,因此适用于文件/压缩包/程序的传输;UDP速度快但是不够安全可靠,因此多应用于视频在线观看的传输。 UDP网络通信编程 流程   1、创建套接字,是进程与网卡直接建立关联。在内核中会创建一个 socket 结构体。在这个结构体中会包含很多与网络通信有关的信息。   2、为套接字绑定地址信息(ip/port)。为了告诉操作系统哪些数据应该由这个进程处理。在操作系统内核中每一个套接字都会有一块缓冲区

python-Unix套接字

寵の児 提交于 2019-11-29 19:01:21
【unix域套接口】 或 【本地套接口】,它用于位于同一台机器(操作系统)的进程间通信。它已经被纳入POSIX Operating Systems标准。 它支持以下三种方式数据传输: (1) 可靠的字节流传输(SOCK_STREAM, 对应TCP); (2) 无序、不可靠的数据包传输(SOCK_DGRAM,对应UDP)。 (3)有序、可靠的数据包传输(SOCK_SEQPACKET)原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。 参考: https://blog.csdn.net/sandware/article/details/40923491 python-Unix套接字 https://www.jianshu.com/p/78103b2a74be 我的测试: 一台Linux主机A。只能在Linux主机上运行,windows主机上不可以运行。 1、A主机的服务端S # 服务端 import socket import os serverAddr = './uds_socket3.txt' # 套接字存放路径及名称 while True: # 地址复用 if os.path.exists(serverAddr):

Java高并发网络编程(一)

倾然丶 夕夏残阳落幕 提交于 2019-11-29 15:51:59
一、OSI网络七层模型 因特网是一个极为复杂的网络,分层有助于我们对网络的理解 。分层也是一种标准,为了使不同厂商的计算机能够互相通信,以便在更大范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。 ISO组织制定了OSI网络七层模型 应用层 表示层 会话层 传输层 网络层 链路层 物理层 而因特网只用到了五层 应用层 传输层 网络层 链路层 物理层 低三层: 屏蔽底层网络的复杂性 物理层:使原始的数据比特流能在物理介质上传输。 数据链路层:通过校验、确认和反馈重发等手段,形成稳定的数据链路。(01010101) 网络层:进行路由选择和流量控制。(IP协议) 传输层:提供可靠的端口到端口的数据传输服务(TCP/UDP协议)。 高三层: 会话层:负责建立、管理和终止进程之间的会话和数据交换。 表示层:负责数据格式转换、数据加密与解密、压缩与解压缩等。 应用层:为用户的应用进程提供网络服务。 网络通信协议 二、传输层控制协议TCP 传输层控制协议(TCP)是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、字节流传输服务。应用程序在使用TCP之前,必须先建立TCP连接。 1.TCP握手机制 检测网络是否通畅 三、用户数据报协议UDP 用户数据报协议UDP是Internet传输层协议。提供无连接、不可靠、数据尽力传输服务。 TCP和UDP比较 四

套接字、UDP通信、TCP通信、TCP/IP协议簇

倾然丶 夕夏残阳落幕 提交于 2019-11-29 13:58:46
一、套接字(socket)   1.英语单词socket:n.插座;穴;v.插入插座   2. 套接字就是源IP地址和目的IP地址、源端口号和目的端口号的组合, 是通过传输层进行通信的。IP指定电脑,端口指定某一具体APP。   3.套接字类型:     流式:SOCK_STREAM,基于TCP;     数据报式:SOCK_DGRAM,基于UDP;     原始式:SOCK_RAW。 二、UDP通信实例 1.综述    UDP貌似可以不区分服务端和客户端,因为代码是一样的,服务端可发可收,客户端亦可发可收。   发送端要先建立套接字,然后设置地址信息,就可以发送了;接收端要先建立套接字,再设置地址信息,再bind,就可以接收了。 2.具体实现 1 #pragma comment(lib,"ws2_32.lib")  //链接该库,也可在工程属性中手动设置,但是麻烦。 2 /*发送消息(Qt控件):每次发送时都要建立套接字,发完再关闭,下次发时重新建立,这是应该不合理的,但是不这样好像也会出错,为了省事就先这样了。*/ 3 WORD wVersionRequested; //用来指定WinSock库版本 4 WSADATA wsaData; //指向WSADATA的指针,包含WinSock库版本的有关信息 5 int err; 6 wVersionRequested =

网络编程 socket介绍

三世轮回 提交于 2019-11-29 13:57:26
Socket介绍   Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。    Socket通信   当通过socket建立起2台机器的连接后,本质上socket只干2件事,一是收数据,一是发数据,没数据时就等着。 Socket实例  socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) family(socket家族) socket.AF_UNIX:用于本机进程间通讯,为了保证程序安全,两个独立的程序(进程)间是不能互相访问彼此的内存的,但为了实现进程间的通讯,可以通过创建一个本地的socket来完成 socket.AF_INET:(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET) socket type类型 socket.SOCK_STREAM #for tcp socket

python 网络编程 TCP/IP socket UDP

牧云@^-^@ 提交于 2019-11-29 13:55:57
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多。 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容,这就好比一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了。 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。Internet是由inter和net两个单词组合起来的,原意就是连接“网络”的网络,有了Internet,任何私有网络,只要支持这个协议,就可以联入互联网。 因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议。 通信的时候,双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上每个计算机的唯一标识就是IP地址,类似123.123.123.123。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个IP地址,所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。 IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去

Http和Socket连接区别

╄→尐↘猪︶ㄣ 提交于 2019-11-29 13:54:00
1、TCP连接 要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开) 2、HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础