• 网络编程基础


    c/s架构:

    ​ 客户端和服务器端

    ​ c端—————网络—————s端

    s端:

    1. 有固定的ip

    2. 稳定一直在运行,支出并发

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

    五层(七层)协议:应传网数物(应表会传网数物)

    物理层(介质加信号):主要就是由二进制组成的 电信号传输介质,处于最底层

    数据链路层(数据帧、mac、广播):主要就是把物理层的电信号进行分组,每一组叫一个数据报/数据帧,每一个数据帧分成,报头head和数据data两部分组成

    1. 每一个数据报,都是由报头和数据部分

      1. 头:固定18个字节,6:发送者地址/6:接收者地址/6:数据类型
    2. MAC地址:发送者,接收者地址,就是mac地址

      1. 每块网卡都有一个唯一的mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)
    3. 广播:同一个局域网内通信,会出现广播风暴(简单来讲就是由于广播数据太多,占用大量的网络带宽,导致正常业务不能运行,甚至瘫痪的现象)

    网络层(ip):

    1. ip: ipv4: 32位2进制表示,点分十进制表示,从0.0.0.0到255.255.255.255,范围是有限的,不能表示出所有的网络设备,于是出现了ipv6
    2. 子网掩码: 通过子网掩码和ip判断两个ip是否处于同一个网段,通过ip地址和子网掩码做按位与(都为1则按位与是1,其余全是0)运算
    3. 172.16.10.10/24 包含了ip地址和子网掩码(24表示的就是24个1,即3组8个1,也就是十进制255.255.255.0)
    4. ip跟mac有转换关系
      1. 主机172.16.10.10/24访问172.16.10.11/24
      2. ARP协议:广播的方式发送数据包,获取目标主机的mac地址
      3. mac地址学习:mac地址和ip地址的映射表
        1. 第一次接收到就会在ip/mac映射表中添加一条数据{‘172.16.10.11’: ddsfjasif
    5. 任何一种协议都有头和内容

    传输层(tcp/udp):

    1. tcp协议;

      1. 三次握手,四次挥手,链接如何建立,发数据如何保证可靠,断开如何断开,在建立链接过程中有状态
      """
      序列号seq: 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号
      
      确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号
      
      确认ACK:占1位,仅当ACK=1时,确认号字段才有效,ACK=0时,确认号无效
      
      PS:ACK,SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack,seq小写的单词表示序号
      
      """
      

    1567688666311

    1567688754952

    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1), 同时自己也发送一个SYN包(syn=k), 即SYN+ACK包,此时服务器进入SYN_RECV状态

    第三次握手:客户端收到服务器端的SYN+ACK包,向服务器发送确认包ACK(ack=k+1), 此包发送完毕,客户端和服务器进入ESTABLISGED(TCP链接成功)状态,完成三次握手

    1567689475193

    1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加一),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

    2.服务器收到连接释放报文,发出确认报文,ACK=1, ack=u+1, 并且带上自己的序列号seq=v, 此时,服务器就进入了CLOSE-Wait(关闭等待)状态,TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受

    3.客户端收到服务器的确认请求后,此时客户端就进入了FIN-WAIT-2(终止等待)状态,等待服务发送连接释放报文(在此之前还需要接受服务器发送的最后的数据)。

    4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认

    5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1, 而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,猜进入CLOSE状态

    6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态,同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些

    服务端如果看到大量的syn_rcvd状态,表明收到了dos和ddos攻击:拒绝服务攻击和分布式的拒绝服务攻击

    端口号:端口范围0-65535,0-1023为系统占用端口

    1. udp协议:

    发送,不需要对方响应,所以数据不可靠(看视频就是基于这种协议进行的,卡顿,马赛克就是数据丢失)

    1. 端口:
      通过ip+子网掩码唯一确定一台设备
      通过ip+子网掩码+端口号唯一确定一个软件
    2. 半连接池
      就是没有完全建立连接时,存进去请求数据,是用先进先出的队列存储的

    应用层 HTTP、DNS(待补充)

    上网流程分析:

    ​ 在浏览器输入www.baidu.com,会取dns服务器通过域名解析成ip地址,向ip+端口号这个地址发送请求,就会访问到百度的服务器

    socket:在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,用来实现进程在网络中通信

    简单的C/S通信

    #Server.py
    #导入一个socket模块
    import socket:
    	
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        soc.bind('192.168.11.191', 8080)#写本机ip,局域网外部可以访问
        #soc.bind('127.0.0.1', 8080) #如果写这个ip,只能自己访问
        soc.listen(5)
        conn,addr = soc.accept()
        data = conn.recv(1024)
        conn.send(b'xxxx')
        conn.close()
        soc.close()
        
    #CLient.py
    import socket
    soc=socket.socket()
    soc.connect(('192.168.11.146', 8080))
    soc.send(b'xxxx')
    data=soc.recv(1024)
    soc.close()
    

    图片来源 https://blog.csdn.net/qq_38950316/article/details/81087809,侵删

  • 相关阅读:
    GrapeCity Documents (服务端文档API组件) V3.0 正式发布
    js 手机号码正则表达式
    springMvc 注解@JsonFormat 日期格式化
    solr java代码
    solr全文检索
    在阿里云服务器CentOS7安装mysql提示“No package mysql-server available上安装mysql遇到的问题
    MockBean 单元测试
    redis缓存
    c3p0连接池
    springboot Transactional事务的使用
  • 原文地址:https://www.cnblogs.com/michealjy/p/11470440.html
Copyright © 2020-2023  润新知