zoukankan      html  css  js  c++  java
  • 网络编程-互联网协议(网络编程)/基于TCP协议的套接字通信/加上通信循环/加上连接循环

    一、C/S、B/S架构
    client客户<------->server服务端
    browser浏览器<------>server服务端
    到底什么是网络?
    人之间要通信,首先底层的物理链接介质要建好,还要通信。
    1.物理链接介质只是通信的载体
    2.要有通信的统一标准(例如英语)
    ============================================================
    计算机要跟其他计算机联系
    物理层:负责接网线,往外联网用,机器上有个网卡负责连接网线,交换机连接路由器,路由器连接防火墙(统称为物理链接介质)   只负责将数据转成二进制。
    数据链层(以太网协议):1组电信号构成一个数据包,称之为'祯'。0101010111110就是电信号 再来另外一组电信号就是另外一组电信号。一组数据帧分成:报头和head和数据data两部分。
    ==============================================================================================================================
    head data。一部分代表头,一部分代表数据。头相当于信封,数据代表信得内容。 head包括发送者源地址,接手者目标地址,数据类型6个字节。
    但凡一个数据都不能是一个单纯的数据,都要配一个头,头是用来描述数据的,头一定要满足一个特征,固定的长度。

    mac地址就是计算机上网卡的地址,有集成的网卡,还有独立的网卡。
    以太网规定但凡接入互联网的机器一定要有一块网卡,因为网卡是来标识你在哪,所以那块网卡标识为以太网卡,计算机上为什么有网卡这块硬件,就是以太网规定的

    以太网协议传播数据的方式,称之为广播。计算机通信基本靠吼

    有了以太网的标准,还有了广播的古老工作传输方式,能不能实现全世界范围内计算机的通信?
    答案是能
    1.首先底层的物理链接地址都必须连接好。
    2.每一台机器上都必备一块网卡。

    ==============================================================================================================================
    mac地址只能在局域网里面用,到此为止。跨局域网,mac地址
    mac地址只能定位在局域网内的地址,光有mac地址还不行,需要标识对方在哪个小圆圈,mac地址搞定不了就靠网络层ip协议,ipv4和ipv6 ip的第六个版本
    IP协议定义了一个新的地址,IP地址用来标识什么?IP地址就是帮我们来找到局域网在哪的。

    目前为止两个地址
    IP地址:IP标识对方的机器在哪个局域网里面。
    MAC地址:对方的机器在局域网哪个位置。

    IP+MAC能标识全世界范围内独一无二的机器。客户端和服务端通信。

    本质原理是软件与软件之间的通信,客户端的软件跟服务端的软件进行通信,但是运行需要机器作为介质。


    IP地址网络层

    传输层:TCP/UDP协议
    基于网络通信的软件都有一个对应端口

    一共三个地址mac IP还有端口地址,所有运行的软件都有一个对应端口。


    接下来的任务,是写一个客户端软件还有一个服务端软件,无论他们分散在世界的哪个角落,客户端都能找到服务端,这是优先解决的问题。
    必须有个办法来标识,全世界范围内独一无二的软件在哪。
    IP地址用来定位到这台计算机在哪个局域网之内,mac地址用来定位这台计算机在局域网哪个为止,端口地址找到这台机器上独一无二的应用软件

    IP+MAC+端口 服务端和客户端都要对应这3个地址。但是服务端比较特殊,服务端必须与服务端的地址捆绑在一起,告诉所有的客户端,我在这个位置

    =====================================================================
    应用层:应用层是程序员写的,标准是程序员定的 可以用一些公用的协议http,mail,ftp

    发包以及解包的过程,

    应用层以自己的标准组织好给传输层,传输层再包一层,丢给网络层,丢给数据链接层,再给物理层(打散了)。 源mac和目标mac

    发包(一层层包的过程)和解包(一层层拆的)的过程



    互联网通信原理介绍
    ARP
    IP---->mac
    mac--->IP

    mac地址是硬件地址,是不会变得,ip地址是可以变得



    arp的功能用来通过ip获取mac,获取mac地址想怎么通信就怎么通信
    计算机会自动调一个arp协议,把ip地址转化成mac地址

    跨局域网 mac地址不能吼出去

    ipv4 点分时进制,每一部分都是10进制,每一部分的取值范围0-255



    子网掩码的作用:
    就可以判断任意两个IP地址是否存在于同一个网络

    互联网通信原理



    传输层有两个协议
    一个是TCP一个是UDP,负责帮我们传输数据的,产生的数据最先交给传输层,传输层最先由操作系统控制的,应用层是应用程序自己控制的,传输层以下都是操作系统控制的,应用程序来一个数据要交给操作系统。
    操作系统经过传输层交给对方的操作系统,再交给对方的传输层再交给对方的应用程序。
    自己的传输层和对方的传输层要建一个双向的通路

    TCP协议发一次数据握一次手---------------三次握手建链接
    传输层以下建了一个通路


    三次握手每个位置都有相应的状态
    机器同时服务于大量的用户,这种状态称之为并发,如果并发请求书过多,服务端会滞留(服务端三个状态,lister,recv,establish),服务端在客户数不多的情况下,状态会迅速消失
    并发状态太少的情况下看不到RCVD状态因为会立刻转化成establish状态。
    如果出现高并发的情况
    三次握手的最终目的建双向通路

    udp协议不可靠传输协议,不建链接,udp传输效率比较高,就发链接

    tcp好处:安全,效率低

    UDP好处不安全,效率高

    转账涉及tcp协议   qq聊天,查询有关的操作用udp协议

    ==========================================================

    基于tcp协议的套接字通信(网络编程)

    AF_INET基于网络通信的套接字
    SOCK_STREAM 流氏协议其实就是TCP协议
    SOCK_DGRAM UDP协议
    127.0.0.1 就代表本机,这个IP地址别人访问不到,只能自己访问,这个称为本地回环地址专门用来自己写程序调试用的,客户端服务端没必要分担到两台机器了,分担到一台机器就可以了



    基于tcp协议的套接字通信
    服务端
    import socket

    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买电话 #AF_INET基于网络通信的套接字 SOCK_STREAM流氏协议(tcp协议)SOCK_DGRAM(udp协议)
    phone.bind(('127.0.0.1',8080)) #插手机卡 #127.0.0.1本地回环地址,专门写程序的时候自己调用的 #端口号8080 0-65535(自己用的) 0-1024(系统用的)
    phone.listen(5) #开机#5相当于最大挂起的链接数 半连接池 5代表同一时间可以来5个请求 可以建n个连接但是同一时间来的请求数只有5

    print('start...')
    conn,client_addr=phone.accept() #等电话连接 conn相当于电话线
    print('连接来了',conn,client_addr)
    #收发消息
    msg=conn.recv(1024) #收消息1024是一个最大的限制
    print('客户端的消息',msg)#收到客户端的消息
    conn.send(msg.upper())#客户端回消息

    #挂电话
    conn.close()#回收系统资源

    #关机
    phone.close()#关闭套接字

      

    客户端

    import socket
    
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(('127.0.0.1',8080)) #拨电话 地址为服务端的ip和端口
    
    phone.send('hello'.encode('utf-8'))   #发消息      发字符串
    data=phone.recv(1024) #收消息
    
    print(data)
    
    phone.close()
    #客户端的端口可以变,服务端的端口是不变的  基于TCP的套接字通信
    

    为什么会报IP地址端口被占用的问题

    跟机器有关,机器反应反应慢,隔一段时间才会回收掉

    
    
  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/8921454.html
Copyright © 2011-2022 走看看