基础回顾
网络的三种架构
- 单机架构:不用联网。
- CS架构:客户端 --> 服务端
- BS架构:客户端 --> 浏览器 --> 服务端
互联网的组成
教材版
- 边缘部分:客户端或服务端
- 核心部分:路由器、基站
科普版
- 硬件:一些硬件设备
- 软件:通过OSI协议组织无序的电信号为有序
OSI七层协议
物理层
连接计算机,传输电信号。
数据链路层
把电信号分组,数据只能在局域网内传输,局域网传输靠mac地址和交换机。
head(以太网头)
发送地址6
目标地址6
数据类型6
data
mac地址才是计算机的唯一编号。
网络层
ip地址,ip地址是靠路由器传输,然后就可以跨局域网通信。
以太网头 + ip头 + data
ip地址是局域网的编号。
ip地址 + mac地址确定世界实独一无二的计算机。
传输层
传输层给了一个端口。
ip地址 + mac地址 + 端口确定世界实独一无二的计算机上的应用程序。
应用层
对数据进行处理解析。
TCP协议
数据从客户端 --> 服务端的协议。
三次握手四次挥手
三次握手建立连接
需要从服务端下载数据,必须建立连接。
- 客户端向服务器发起一个请求,会有一个SYN报头。
- 服务端会接收到客户端的请求,会响应客户端,并且把SYN报头改装后又返回客户端,会有ACK的报头。
- 客户端开始进入建立连接状态,再发一条请求,请求带上ACK给服务端,让服务端也进入连接状态。
四次挥手关闭连接
- 客户端会发送请求带上FIN报头给服务端说我够了,要断开连接。
- 服务端接收到客户端的请求后,返回一个带有ACK的请求说确认了。
FIN报头并没有返回;但是服务器此时还有可能传输数据。 - 服务端数据传输结束之后,服务端又会发送一次带报头的FIN的请求,告诉客户端我结束了。
- 客户端向服务端进行一次确定,已经把所有的数据都接收完了。
基于TCP协议的套接字编程
import socket
粘包问题
TCP是流式协议,存在粘包问题。
UDP是数据报协议,适合短数据传输。
TCP协议才有粘包问题,UDP协议没有粘包问题。
粘包问题的几种情况
- D1和D2间隔时间长,两者数据量小,不会发生粘包问题。
- D1和D2间隔时间非常短,两者数据来小,会发生粘包问题,TCP协议本身规定的。
- D2比较大,D1比较小,间隔时间短,服务端一次性读取D1和D2的一部分,出现了粘包问题。
- D1大,D2比较小,获取了D1的一部分,然后获取了D1的剩余部分和D2,出现了粘包问题。
怎么解决
- 两者间隔时间变长
- 发送之前告诉客户端数据的大小
发送前告诉大小,这个大小也会占位置,所以大小的位置必须得固定。
import struct
UDP协议
直发直收,安全性较低。
并发编程
同一时刻有多个任务。
import socketserver