• 网络编程-互联网协议(网络编程)/基于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地址端口被占用的问题

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

    
    
  • 相关阅读:
    BZOJ_2002_[Hnoi2010]Bounce 弹飞绵羊_LCT
    BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree
    BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并
    2019集训队作业做题实况[1](1-30):
    牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)
    【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)
    CodeChef Max-digit Tree(动态规划)
    骚操作:c++如何用goto便捷地写人工栈?
    Comet OJ
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/8921454.html
Copyright © 2020-2023  润新知