网络编程基础

客户端/服务器架构

C/S架构:
即: 客户端 ——————————————————服务端 架构(基于TCP协议)
B/S架构:
即: 网页端 ——————————————————服务端 架构(基于HTTP协议)

osi七层协议

1、互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

七层:物理层——>数据链路层——>网络层——>传输层——>会话层——>表示层——>应用层
五层:物理层——>数据链路层——>网络层——>传输层——>应用层(会话层——>表示层——>应用层)
四层:网络接口层(物理层——>数据链路层)——>网络层——>传输层——>应用层(会话层——>表示层——>应用层)

2、物理层

​ -本层对应的主要硬件设备为网线
​ -数据被转化为高低电信号(01信号),通过网线传输
​ -数据传输的基本单位为比特位,8个比特位为1个字节

3、数据链路层

​ -数据链路层的功能:定义了电信号的分组方式,让01信号可以有效表达意义
​ -本层主要的硬件设备为网卡
​ -网卡上标识有全球唯一的MAC地址,对于计算机来说是独一无二的
​ -以太网协议(ethernet):本层会对数据进行“打包”,叫做数据帧,结构为:报头+数据,报头是MAC地址,用 以标识本台计算机与目标计算机
​ -广播:基于MAC地址,两台计算机在局域网内可以实现通信,具体过程为:源计算机打包数据——>广播——> 目标计算机接受数据——>解析数据——>根据目标Mac返回数据

4、网络层

​ -有了以太网协议,MAC以及广播的方式,世界上所有的计算机就可以实现通信,但是要求所有计算机处于同一局域网,显然,这是不可能的,我们需要网络通信

​ -ip协议:规定了网络地址为ip,范围为:0.0.0.0-255.255.255.255,一个ip地址通常写成四段十进制数,如:192.198.0.0

​ -子网掩码:用于标识不同的局域网,形式和ip地址一样,由32位二进制组成,通过与ip地址按位与运算,可以查看两台计算机是否在同一局域网内

​ -数据包:本层在数据帧的基础上,加入了ip头,用于标识两台计算机的网络位置

​ -ARP协议:用于获取目标MAC,通过IP影射MAC,通过此项协议,实际上只需要IP就可以标识具体的某一台电脑

5、传输层

​ -通过ip与MAC地址,我们可以找到独一无二的计算机,但是这台计算机可能运行着众多应用软件,我们需要找到目标软件

​ -端口:端口即应用程序与网卡关联的编号。传输层的作用就是建立端口到端口的通信;端口范围0-65535,0-1023为系统占用端口

​ -TCP/UDP协议

​ -TCP协议:可靠的传输协议,因为其需要事先建立双向通路后,才会传输数据

​ -UDP协议:不可靠的传输协议,不会确认是否建立双向通路就会开始传输数据,数据丢失找不回数据

​ -数据段:会在网络层基础上加上TCP/UDP数据报头,称为数据段

6、应用层

​ -用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式

​ -应用层就是规定好数据传输的组织形式

​ -使用的主要协议有:htpp,ftp,websocket....

7、三次握手与四次挥手

TCP协议在传输数据时,会提前建好双向的数据通路,建立过程就是三次挥手的过程,断开的过程就是四次挥手过程

img

1、三次挥手:

​ -客户端向服务端发送建立连接请求:SYN=1,seq=x,SYN=1代表建立连接,seq验证信息

​ -服务端收到请求,返回消息:同意建立&与客户单建立连接的请求:SYN=1,seq=y,ack=x+1

​ -客户端收到请求,回复服务端可以,双向通路建成:ack=y+1

2、四次挥手

​ -客户端向服务端发送断开连接请求:FIN,seq=X+2,ACK=y+1

​ -服务端收到断开信号请求,客户端发送同意断开连接信息,连接断开:ACK=x+3

​ -服务端向客户端继续传输数据,知道数据传输完毕,向客户端发送断开连接请求:FIN,seq=y+1

​ -客户端收到断开信号请求,发送同意信号,连接断开

常用端口号

应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP

DNS:把网址转换成ip地址

从浏览器发送出去的数据,都是http协议,默认是80端口

Socket层

1 Socket抽象层,从osi七层抽象出来的,抽象了网络层和传输层,跟语言无关,任何语言都会有socket的封装
2 专门给开发人员用的

基于Tcp的socket套接字

服务端

# 导入socket模块
import socket
# 创建socket对象
server = socket.socket()

#绑定端口地址(监听ip,监听port)
server.bind(('196.128.11.124',8008))
# 监听状态,半连接池是5,可以缓冲5个
server.listen(5)

# 等待用户连接,返回连接对象和客户端地址
sock,addr = server.accept()

# 接受客户端的信息
data = sock.recv(1024)
print("收到来自%s的信息%s" % (addr,data))

# 给客户端发消息
sock.send("sb".encode("utf-8"))

# 关闭连接对象
sock.close()

# 关闭服务
server.close()

客户端

import socket

# 创建socket对象
client= socket.socket()

# 连接到服务端
client.connect(('196.128.11.124',8008))

# 给服务端发送信息
client.send("sb".decode("utf-8"))

# 接受服务端返回的数据
data = client.recv(1024)

print(data)
# 关闭
client.close()
posted @ 2021-04-21 08:36  猫咪也会码代码  阅读(67)  评论(0编辑  收藏  举报