TCP协议
面向连接,可靠,慢,对传递的数据的长短没有要求
面向连接
两台机器之间要想传递信息,必须先建立连接
之后在有了连接的基础上,进行信息的传递
可靠
数据不会丢失,不会重复被接收
三次握手,四次挥手
这种可以互相发送信息的连接方式叫做全双工的通信方式
三次握手:为了开始连接 三次握手分别是
客户端发送信息请求连接
服务端回复信息表示收到,再发送信息请求连接
客户端回复信息表示收到
四次挥手:为了结束连接 四次挥手分别是
客户端发送信息请求断开连接
服务端回复信息表示收到
服务端发送信息请求断开连接 (不跟上一条合并成一条的原因是客户端断开连接是因为想要传递的数据已经传递完了 而服务端给客户端传递数据可能没传递完)
客户端回复信息表示收到
慢
因为每一次发送的数据还要等待结果
TCP协议实现的多人聊天
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket sk = socket.socket() sk.bind(('127.0.0.1',9056)) sk.listen() while 1: conn,addr = sk.accept() while 1: n = input('>>>') if n.upper() == 'Q': break conn.send(n.encode('utf-8')) msg = conn.recv(1024) if msg.upper() == 'Q': break print(msg.decode('utf-8')) conn.close() sk.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket sk = socket.socket() sk.connect(('127.0.0.1',9056)) while 1: msg = sk.recv(1024).decode('utf-8') if msg.upper() == 'Q': break print(msg) n = input('>>>') sk.send(n.encode('utf-8')) if n.upper() == 'Q': break sk.close()
socket server(多线程并行)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socketserver class MyServer(socketserver.BaseRequestHandler): # 继承的类固定的 def handle(self): # 必须是这个handle名字. while 1: from_client_data = self.request.recv(1024).decode('utf-8') print(from_client_data) to_client_data = input('>>>').strip() self.request.send(to_client_data.encode('utf-8')) if __name__ == '__main__': ip_port = ('127.0.0.1',8848) server = socketserver.ThreadingTCPServer(ip_port,MyServer) server.serve_forever()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket phone = socket.socket() # 可以默认不写 phone.connect(('127.0.0.1', 8848)) while 1: content = input('>>>').strip() phone.send(f'对象人名:{content}'.encode('utf-8')) from_server_data = phone.recv(1024) print(f'来自服务端消息:{from_server_data.decode("utf-8")}') phone.close()
UDP协议
无连接,不可靠,快,不能传输过长的数据
无连接
机器之间传递信息不需要建立连接,直接发就行了
不可靠
数据有可能丢失
UDP协议实现的多人聊天
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9555)) while 1: msg,addr = sk.recvfrom(1024) print(msg.decode('utf-8')) con = input('>>>') sk.sendto(con.encode('utf-8'),addr) sk.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket sk = socket.socket(type=socket.SOCK_DGRAM) addr = ('127.0.0.1',9555) while 1: con = input('>>>') if con.upper() == 'Q': break sk.sendto(con.encode('utf-8'),addr) msg = sk.recv(1024).decode('utf-8') if msg.upper() == 'Q': break print(msg) sk.close()
即使通讯类的软件: QQ , 微信 , YY 视频在线观看 大部分是基于UDP协议
发文件,邮件的时候 视频缓存观看 大部分是基于TCP协议
osi七层协议
应用层
表示层 合并到应用层
会话层 合并到应用层
http协议
代表用户层 python
send ('hello world')
socket
传输层
所有和端口有关的信息 TCP/UDP协议
对应的物理设备:四层路由器,四层交换机(除了本来的IP和mac地址信息,还可以理解端口信息和TCP/UDP协议)
网络层
和IP地址相关的内容
IP协议
对应的物理设备:路由器,三层交换机(这个交换机能够在三层工作,具有路由器的功能)
数据链路层
和mac地址相关的事情
arp协议
对应的物理设备:网卡,交换机,二层交换机(普通的交换机)
物理层
把所有的东西转成10101010
对应的物理设备:网线
发送信息时是从上到下拼接
发送给另外一台机器
另外一台机器也具备这些协议
但从下往上走
先看mac地址
再看IP地址
确定了就是我要找的机器
越接近确认是不是我的机器的内容 越往下走
越接近是不是这个服务 应用 发送什么内容 越往上走
是一个U形的过程