了解套接字之前,需要先了解基本的传输模型
其次,还需要了解网络的七层划分和四层结构
在python中,数据链路层相当于硬件层,python不需要了解,只用在传输层进行学习就足够了
其中,传输层分为TCP传输协议和UDP协议,TCP协议相当于打电话,是可靠传输,但是UDP的传输是不可靠的,就像发短信,
当短信发出,可能会出现时间的混乱,可能会出现发送失败的情况,是不可靠的。
需要提前明白的是:
作为python开发,都是在应用层的HTTP之上进行开发的,而HTTP协议是基于TCP协议之上的
python网络编程,其最底层,就在传输层,再往下,python是做不了的
还需要了解的,关于TCP的连接
建立连接(三次握手)
数据传输
断开连接(四次挥手)
1. 建立连接(三次握手)
客户端向服务器发起请求连接的包(一次),当服务器接收的请求,就会返回一个同意连接的包(第二次),
在客户端就会建立连接,然后向服务器发送已经建立连接的信息(三次),服务器收到客户端成功连接的信息,
就会正式开始连接
【第三次是为了确认,假设如果客户端网络不好,第一次请求由于网络延时,由于长时间的等待
客户发起了第二次请求,完成了三次握手后,第一次请求连接的包发送到了服务器,服务器向客户端发起同意连接,
但是并没有收到客户端的成功连接信息,服务器就不会建立连接,从而达到网资源的不浪费】
2. 数据传输
数据的传输,客户端发起请求,服务器发起响应,完全按照一发一收,一收一发
3.断开连接(四次挥手)
客户端向服务器发起完成(出动关闭)请求(第一次),服务器收到请求返回同意请求(第二次),但此时并没有完全关闭,还会有一段等待的时间,
服务器会在会这短时间将未传输完成的数据传输完毕,当完成全部传输,就会向客户端发起关闭请求(第三次),客户端收到以后,会返回确认信息(第四次),
这时服务器就会关闭,客户端会也会等待一段时间,然后关闭。
【第四次还是为了确认】
通信定位的流程
1. 先找IP
IP地址确定用户,127.0.0.1表示本地IP,0.0.0.0表示任意访问 最大到255.255.255.255
2. 再找端口
端口从0到65535,0~1023都是一些专有特殊端口,不能使用。1024~65535之间的是动态端口,可以随意使用(也有特殊的)。
其中,一些特殊的,比如80表示HTTP,22表示ssh,21FTP,3306表示Mysql,6379表示redis,27017表示MongoDB
最后学会使用套接字socket创建服务器和客服端
创建一个服务器端口
1 import socket 2 server = socket.socket() 3 server.bind(("", 9999)) # 元组 4 server.listen(3) # python3.6以后才支持的监听最大量操作 5 conn,addr = server.accept() # 取conn建立对等连接 6 while True: 7 data = conn.recv(1024) 8 if not data: 9 break 10 print(data.decode()) 11 conn.send(data) #原数据返回 12 conn.close() 13 server.close() #关闭
建立一个客户端:
import socket client = socket.socket() client.connect(('127.0.0.1', 9999)) #本地IP while True: data = bytes(input('>>>'), encoding='utf-8') if not data: break client.send(data) # 发送消息 re_data = client.recv(1024) print('回执消息:', re_data) client.close()
先运行服务器,再运行客户端,就可以向服务器发送信息,并接收到服务器回执的相同的消息