网路编程的目的就是要开发出一个基于CS结构的应用程序
服务器:存在着需要共享的数据,以及运行有共享数据的应用程序的计算机就称为服务器
客户端:运行有用接收共享数据的应用程序的计算机,就称之为客户端
要通讯
1.必须有物理连接介质
2.通讯协议
通讯协议:
osi 七层模型
应表会传网数物七层
应用层
传输层
网络层
网络接口层
数据链路层
物理层
应表会传网数物
物:定义物理连接介质相关的协议
数据链路层:以太网1.规定一组电信号的长度,包含head和data
2.MAC全球唯一的标识
3.广播通讯
网络层:ip协议,规定每一台计算机必须拥有一个ip地址
包含主机号和网络号
子网掩码
arp协议通过ip获取mac地址
传输层:在上四层的基础上,已经可以在全球范围内进行通信,但是网络具备不稳定性(断网)
需要保证数据完整时:采用tcp协议
为了识别应用程序给每一个应用程序都绑定一个端口号
客户端和服务器都需要端口号,区别在于服务器需要绑定一个固定的端口号,而客户端则可以随意改变
tcp:三次握手和四次挥手并且传输过程中每一个消息都会要求对方返回确定信息来保证数据完整
udp:只负责将数据发送到网络中就完事,不关心对方是否接收到数据
应用层:由应用程序自己来定义的数据协议
tcp的粘包问题
基于流的协议,数据在发送前会进入操作系统缓冲区,会导致多个消息数据之间没有明显的区别,导致粘包
接收方没有及时从缓冲区读取数据,造成多次接收的数据黏在一起
解决方案:先发送数据的长度信息,在发送真实数据 接收方先接收长度信息 在接收真实数据
所以长度和真实数据也会粘包,所以需要将长度信息所占的字节数固定下来
这便需要用到struct模块pack unpack
udp在使用时需要修改socket的参数第一个任然时AF_INET第二个是SOCK_DGRAM
udp不需要建立连接 所以没有三次握手和四次挥手
相同点:
服务器: 都需要绑定端口和ip
不同点:
服务器:不需要监听 和接收请求
tcp服务器默认 只能与一个客户端进行通讯 下一个客户端必须等待上一个断开来凝结才能被处理
udp多个客户端的请求会被依次处理由于不需要建立连接,所以给你感觉可以同时处理
客户端:不需要建立连接 直接发送即可,可以发送空消息
在udp中无论是客户端还是服务器 接收:recvfrom 发送sendto
接收方的缓冲区大小即使大于发送方发送的数据长度 也不会粘包
当接收方缓冲区的长度小于数据报的长度 windows会报异常 而Linux不会,缓冲区多大就接收几个
注意:udp在使用时必须保证接收的缓冲区大小 大于或等于 发送的数据报大小
由于缓冲区大小不可能无限大所以udp不适用于数据较大的情况下,如果一定要使用udp来传输大量数据的话需要自己对数据进行切割和组装
udp最大的数据报 受数据大小限制最大为1472字节
结论:当数据量较大时 需要tcp