研一下学习记录(一)
并发网络编程(一)–网络编程
这一节总结并发网络编程部分第一节网络编程的内容,参考教程为某内人工智能课程,稍后在资料部分上传pdf.不会介绍详细内容,仅仅记录我自己的重难点,要看详细内容请看pdf文件。
1. 网络基础知识
ifconfig: 查看Linux系统下计算机的IP地址命令
ping[ip]:查看计算机的连通性
端口号
端口:网络地址的一部分,在一台计算机上,每个网络程序对应一个端口。
特点:
- 取值范围: 0 —— 65535 的整数
- 一台计算机上的网络应用所使用的端口不会重复
- 通常 0——1023 的端口会被一些有名的程序或者系统服务占用,个人一般使用 > 1024的端口
1.2 UDP传输方法
套接字:
实现网络编程进行数据传输的一种技术手段,网络上各种各样的网络服务大多都是基于 Socket 来完成通信的。Python套接字编程模块:import socket
UDP套接字编程
- 创建套接字:sock=socket.socket(AF_INET,SOCK_DGRAM)
- 绑定地址:sock.bind((ip,port))
- 消息收发: data,addr=sock.recvfrom(buffersize),buffersize为每次最多接收的字节数
n=sock.sendto(data,addr),n 为发送的字节数 - 关闭套接字:
sock.close()
UDP套接字特点:
- 可能会出现数据丢失的情况
- 传输过程简单,实现容易
- 数据以数据包形式表达传输
- 数据传输效率较高
1.3 TCP传输方法
1.3. 1 简单介绍
面向连接的传输服务
-
传输特征 :
– 提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。
– 可靠性保障机制(都是操作系统网络服务自动帮应用完成的): 确认应答机制 通信结束要正常断开连接 -
三次握手(建立连接)
– 客户端向服务器发送消息报文请求连接
– 服务器收到请求后,回复报文确定可以连接
– 客户端收到回复,发送最终报文连接建立 -
四次挥手(断开连接)
– 主动方发送报文请求断开连接
– 被动方收到请求后,立即回复,表示准备断开
– 被动方准备就绪,再次发送报文表示可以断开
– 主动方收到确定,发送最终报文完成断开
1.3.2 tcp套接字编程
- tcp服务端:socket - bind- listen-accept-send/recv-close
- sock=socket.socket(AF_INET,SOCK_STREAM)
- sock.bind((host,port))
- sock.listen(n)
- conn,addr=sock.accept()
- data=conn.recv(buffersize)
- n=conn.send(data)
- conn.close()
- sock.close()
- tcp客户端:socket-connect-send/recv-close
- sock=socket()
- sock.connect()
- n=sock.send()
- sock.recv(buffersize)
- sock.close()
1.3.3 tcp套接字细节
-
tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
-
tcp连接中如果一端已经不存在,仍然试图通过send向其发送数据则会产生BrokenPipeError
-
一个服务端可以同时连接多个客户端,也能够重复被连接
1.3.4 tcp粘包问题
产生原因
- 为了解决数据再传输过程中可能产生的速度不协调问题,操作系统设置了缓冲区
- 实际网络工作过程比较复杂,导致消息收发速度不一致
- tcp以字节流方式进行数据传输,在接收时不区分消息边界
带来的影响
如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
处理方法
消息格式化处理,如人为的添加消息边界,用作消息之间的分割
控制发送的速度
1.3.5 tcp udp对比
- 传输特征
1. TCP提供可靠的数据传输,但是UDP则不保证传输的可靠性
2. TCP传输数据处理为字节流,而UDP处理为数据包形式
3. TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高 - 套接字编程区别
创建的套接字类型不同
tcp套接字会有粘包,udp套接字有消息边界不会粘包
tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要
tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom - 使用场景
tcp更适合对准确性要求高,传输数据较大的场景
文件传输:如下载电影,访问网页,上传照片
邮件收发
点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
udp更适合对可靠性要求没有那么高,传输方式比较自由的场景
视频流的传输: 如部分直播,视频聊天等
广播:如网络广播,群发消息
实时传输:如游戏画面
在一个大型的项目中,可能既涉及到TCP网络又有UDP网络