python网络编程Socket库

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议

应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

传输层:TCP,UDP

网络层:IP,ICMP,OSPF,EIGRP,IGMP

数据链路层:SLIP,CSLIP,PPP,MTU

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口

通信流程

服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket

服务器为socket绑定ip地址和端口号

服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开

客户端创建socket

客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket

服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求

客户端连接成功,向服务器发送连接状态信息

服务器accept方法返回,连接成功

客户端向socket写入信息

服务器读取信息

客户端关闭

服务器端关闭

三次握手

在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接

第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认

第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

服务器socket与客户端socket建立连接的部分其实就是三次握手

Python提供了两个基本的 socket 模块。

第一个是 Socket,它提供了标准的 BSD Sockets API。

第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

Socket 类型

套接字格式:

socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

socket类型

描述

socket.AF_UNIX

只能够用于单一的Unix系统进程间通信

socket.AF_INET

服务器之间网络通信

socket.AF_INET6

IPv6

socket.SOCK_STREAM

流式socket , for TCP

socket.SOCK_DGRAM

数据报式socket , for UDP

socket.SOCK_RAW

原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头

socket.SOCK_SEQPACKET

可靠的连续数据包服务

创建TCP Socket:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

创建UDP Socket:

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

代码实现:

server端

import socket s1 = socket.socket() s1.bind(127.0.0.1, 2345) s1.listen(5) while 1: conn, address = s1.accept() print a new connect from, address conn.sendall(hello word) conn.close()

s1 = socket.socket() 创建服务端套接字

s1.bind(127.0.0.1, 2345) bin()函数由服务端Socket调用,会将之前创建Socket与指定ip地址和端绑定。2345为端口

listen()函数用于在使用TCP的服务端开启监听这个函数可以使用一个参数来指定可以挂起最大的连接数,参数值最小为1,一般设置为5。

accept()函数用于在使用TCP的服务端接收连接,一般是阻塞态。 接收TCP连接并返回(conn,address),conn是新的套接字对象,可以用来接收和发送数据,address是连接客户端地址。

client端

import socket s2 = socket.socket s2.connect((127.0.0.1, 2345)) data = s2.recv() s2.close() print received, repr(data)

connect()函数用于在使用TCP客户端去连接服务端时使用,使用的参数一个元组,形式为(hostname,port)