07_01、软件开发架构、OSI七层协议、Socket编程


一、软件开发架构

1、C/S架构

    C:   client 客户端
    S:server 服务端

客户端可以有多个
服务端需要具备的两大特征:
  1. 24小时对外提供服务
  2. 必须要有一个公网IP地址

2、B/S架构

    B: browser 浏览器
    S: server 服务端

本质上B/S也是C/S架构

二、OSI七层协议

互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。

实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。区分出来的目的只是让你明白哪一层是干什么用的。

七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

五层划分为:应用层、传输层、网络层、数据链路层、物理层。

四层划分为:应用层、传输层、网络层、网络接口层。

每层常见的物理设备

三、OSI七层协议—网络层

网络层的由来:

有了ethernet、Mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由 一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到。这个问题就不仅仅是效率低的问题了,更会是一种灾难。

所以必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关

网络层功能:

引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

IP协议:

规定网络地址的协议叫IP协议,它定义的地址称之为IP地址,广泛采用的v4版本即IPv4,它规定网络地址由32位2进制表示

IP协议规定了接入互联网的任何一台计算机都要有有个ip地址,ip地址能够确定世界上任何一台接入互联网的计算机

ip地址:

    ipv4:
        最小:0.0.0.0
        最大:255.255.255.255
        本机回环地址:127.0.0.1
    ipv6:表示的范围非常大

本机ip地址的查看方式;win + r => cmd  => ipconfig

公网IP和内网IP:

公网IP: 是需要购买的
内网IP:192.168开头

广域网,局域网

四、OSI七层协议—传输层

传输层的由来:

网络层的IP帮我们区分子网,以太网层的Mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序。

那么我们通过IP和Mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。

传输层功能:

建立端口到端口的通信

端口(port)

范围0-65535,0-1023为系统占用端口,1024-8000 是常用软件使用的端口,以后我们自己开发的软件端口号要使用8000以后的

一个端口在同一时间不能同时使用

有了Mac地址+IP地址+端口,我们就能确定世界上独一无二的一台计算机上的应用程序

  常用软件的端口号

应用程序      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

# http协议的端口号:80
# https协议: http + ssl证书

TCP协议

也叫流式协议, 可靠协议

  TCP三次握手和四次挥手

UDP协议

不可靠传输,没有传输通道

应用场景:远程控制软件

TCP协议换人UDP协议的优缺点:

        TCP:
            1. 数据安全可靠
            2. 速度慢
        UDP:
            1. 数据不安全,也不可靠
            2. 速度快

五、Socket编程

1、什么是Socket编程

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的

2、套接字工作流程

3、 基于TCP协议的套接字编程(简单)

3.1 服务端

# 1. 实例化对象socket
import socket

# 2. 得到对象
# 2.1. 如果不传参数,代表的是TCP协议:SOCK_STREAM
# 2.2 type=socket.SOCK_DGRAM => UDP协议

# server = socket.socket(type=socket.SOCK_STREAM)
server = socket.socket()

# 3. 绑定
server.bind(('127.0.0.1', 8002))

# 4. 监听, 数字代表的是半连接池
server.listen(3)

print('服务端开始接收客户端消息了:')
# 5.
# sock: 当前连接的客户端对象
# addr: 客户端的地址
sock, addr = server.accept()

# 6. 接收客户段发送的消息
# 1024代表的是字节数,接收数据的最大字节数
# 粘包现象
data = sock.recv(1024)  # hello
print('客户端数据:', data)

# 7. 给客户端返回数据
sock.send(data.upper()) # HELLO

# 8. 断开连接
sock.close()

# 9. 关门
server.close()

3.2 客户端

# 1. 实例化对象
import socket
client = socket.socket()


# 2. 连接
client.connect(('127.0.0.1', 8002))

# 3. 给服务端发送数据,发送的数据类型必须是字节类型
client.send('hello'.encode('utf-8'))

# 4. 接收服务端发送过来的数据
data = client.recv(1024)
print('服务端的数据:', data)

# 5. 断开连接
client.close()

相关