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)