• 网络编程(初学)


    网络编程

    一、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()
    

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

  • 相关阅读:
    java实现机器人行走
    java实现机器人行走
    java实现机器人行走
    java实现机器人行走
    java实现机器人行走
    java实现购物券消费方案
    java实现购物券消费方案
    java实现购物券消费方案
    java实现购物券消费方案
    《技术垄断:文明向技术投降》
  • 原文地址:https://www.cnblogs.com/zhuangyl23/p/11468865.html
Copyright © 2020-2023  润新知