网络编程(初学)

网络编程

一、C/S和B/S架构

1.1 两个架构的概念

c:client s:server 客户端 服务端,例如电脑上装的qq、微信

b:browser s:server 浏览器 服务端,例如京东、天猫

b/s架构本质也是c/s架构

现在学习网络编程就是为了写一个c/s架构的软件

1.2 c端------------网络---------------s端

s端(服务器端):

  • 有固定ip
  • 稳定一直运行,支持并发

网络:网络连接介质+网络协议(osi七层)

二、网络协议的五层模型

网络协议:又称OSI七层协议,分为应用层(应用层,表示层,会话层)、传输层、网络层、数据链路层、物理层。

第一层:物理层

主要接受01010001等电信号

第二层:数据链接层

将物理层的电信号分组。

  • 每一组叫一个数据报(数据帧),都有报头和数据部分 (头:固定18个字节,6:发送者地址 6:接收者地址 6:数据类型)
  • mac地址:发送者,接收者地址,就是mac地址
  • 每块网卡都有一个唯一mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)
  • 广播:同一个局域网内通信,会出现广播风暴

第三层:网络层

已有自己的mac地址,访问对象,发送自己的IP和目标IP,通过arp协议广播发送,目标用户确认IP后发送mac地址,获取对方mac地址填入mac地址。

  • ip

    ipv4:32位2进制表示:点分十进制表示 从0.0.0.0到255.255.255.255,范围是有限的,不能表示出所有的网络设备,于是出现了ipv6
    
  • 子网掩码:通过子网掩码和ip判断两个ip是否处于同一个网段,通过ip地址和子网掩码做按位与运算

    1. ip地址:  172.16.10.1:      10101100.00010000.00001010.000000001
    2. 子网掩码:255.255.255.0:     11111111.11111111.11111111.000000000
    3. 按位与运算:172.16.10.0      10101100.00010000.00001010.000000000
       -172.16.10.10/24  包含了ip地址和子网掩码
    
  • ip跟mac有转换关系

    1. 主机172.16.10.10/24访问172.16.10.11/24
    2. ARP协议:广播的方式发送数据包,获取目标主机的mac地址
    3. mac地址学习:mac地址和ip地址的映射表
    	第一次接收到就会在ip/mac映射表中添加一条数据{’172.16.10.11“:ddsadfgegsdgsdg}
    
  • 任何一种协议都有头和内容

第四层:传输层

端口与端口连接

  • tcp协议

    发送请求,等待响应,建立连接,信息交互。因为发送过程中需要回执,因此tcp连接可靠。

    1. 三次握手,建立连接
    2. 四次挥手,断开连接
    3. 连接如何建立,发数据如何保证可靠,断开如何断开,在建立连接过程中有状态
    4. 服务如果看到大量的syn_rcvd状态,表明正在遭受攻击
    5. dos和ddos攻击,拒绝服务攻击和分布式拒绝服务攻击
    6. 端口号:端口范围0-65535,0-1023为系统占用端口

img

  • udp协议

    只发送请求,不需要对方响应,因此数据不可靠(例如看视频)

  • 端口

    1. 通过ip+子网掩码唯一确定一台设备
    2. 通过ip+子网掩码唯+端口号唯一确定一个软件
    
  • 半连接池

第五层:应用层

进入进程服务

三、写一个客户端和服务端的例子

写一个客户端,实现给服务端发送hello world字符串,写一个服务端,将客户端发送的数据变成大写后返回

# 客户端
import socket
# 创建一个socket对象
soc=socket.socket()
# 连接服务端
soc.connect(('192.168.11.176',24))
# 发送消息
soc.send(b'hello world')
# 接收1024个字节
data=soc.recv(1024)
print('我收到服务端返回的',data)
# 关闭连接
soc.close()
# 服务端
# 导入一个socket模块
import socket
# socket.SOCK_STREAM表示建立tcp连接,socket.SOCK_DGRAM表示udp连接
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定ip地址,传元组:(ip,端口号)
soc.bind(('192.168.11.176',24))  # 如果写本机ip,局域网外部可以访问
# 如果ip写127.0.0.1,只能自己访问
# 开机,监听,这个5是半连接池的大小
soc.listen(5)
# 等待接收别人的请求
conn,addr = soc.accept()
# conn就是通路-
data = conn.recv(1024).upper() # 接收1024字节
print('服务器接收到客户端发的',data)
# conn.send发送数据,数据必须是bytes格式
conn.send(b'what can i help you?')
# 关闭通路
conn.close()
# 关闭连接
soc.close()

必须先把服务器文件运行着,客户端文件才能运行,连接到服务端

原文地址:https://www.cnblogs.com/zhuangyl23/p/11468865.html