TCP/IP
TCP/IP协议:https://blog.csdn.net/L_fengzifei/article/details/123482374
1. 概念
socket接口连接应用层和传输层,具体来说属于传输层的内容
网络数据传输过程
发送信息的应用程序,通过socket变成接口把信息传给操作系统的TCP/IP协议栈通信模块 通过TCP/IP协议栈通信模块一层层传递给其他通信模块,最后再通过网卡等硬件设备发送到网络上去 经过网络上路由器的一次次转发,最终到了目标程序所在的计算终端设备,再通过终端的操作系统的TCP/IP协议栈通信模块一层层的上传 最终接收信息的程序,通过socket编程接口接收到了传输的信息
requsets库底层也是使用socket编程接口发送http请求信息 http传输的消息,底层也是通过TCP/IP协议传输的
1.1 消息格式
消息:消息头+消息体 消息头:长度、类型、状态 消息体:数据
特别针对TCP协议传输,格式定义一定要明确规定消息边界 TCP传输的是字节流,如果没有指定边界或成都,接收方对数据的处理存在歧义(开始和结束)
TCP数据传输过程
发送和接收不一定是完整的消息 https://www.bilibili.com/video/av74106411/?p=82&spm_id_from=pageDriver
应用程序发送数据(字节流),数据存在本机的发送缓冲中,然后根据网络传输协议(四层TCP/IP协议),再发送给对方。socket.send() 会返回实际上本次存储到发送缓冲中的字节长度(返回值是要发送的字节数量,该数量可能小于string的字节大小) 达到对方主机中,先将数据存储到接收缓冲中,socket.recv(bufsize) 定义要接收的最大数量
解决方法:定义消息头或消息尾部 指定消息边界的方法
用消息内容中不可能出现的字节串作为消息的结尾字符 定义消息头,直接指定消息长度
2. socket
socket(套接字)
应用程序通过套接字向网络发出请求或应答网络请求,使主机间火车一台计算机上的进程间可以通信
服务端一般先于客户端启动 服务端和客户端都可以收发消息
socket.bind()
socket.listen()
socket.accept()
socket.connect()
socket.close()
socket.recv()
socket.send()
socket.sendto()
socket.recvfrom()
import socket
sockect.socket()
from socket import socket
socket([family,[type[,proto]]])
2.1多线程响应???
python多线程
2.2 TCP/UDP
https://www.byhy.net/tut/py/etc/socket/
UDP是无连接协议
无需事先建立虚拟连接,可以直接给对方地址发消息 缺点:不安全,UDP协议本身没有重传机制;TCP协议底层有消息验证是否到达,如果丢失,发送会重传 数据消息发送是独立的报文:TCP协议通信双方的信息数据有明确的先后顺序(发送方应用先发送的信息肯定是先被接收方应用先接收的)。UDP协议发送的是一个个独立的报文,接收方应用接收到的次序不一定和发送的次序一致
系统设计时要确定应用语义中的最大报文长度,从而可以确定一个对应长度的应用程序接收缓冲,防止只接收一部分的数据
TCP socket是字节流协议,如果应用接收缓冲不够大,只接收了一部分数据,后面可以继续接收,然后搜索找到边界拼接就可以 UDP socket是数据报协议,如果只接收了数据报的一部分,剩余的消息就会被丢弃,下次接收只能接收 补充说明–没看???https://www.byhy.net/tut/py/etc/socket/
|