zoukankan      html  css  js  c++  java
  • 网络基础复习01

    由于不同机器上的程序要通信,才产生了网络
    C/S架构
    server 服务端
    client 客户端
    服务端 是 要一直运行 等待服务别人
    客户端 是 我用的时候 我才去用

    B/S架构
    server 服务端
    broser 浏览器
    使用浏览器去访问的服务 就是一个B/S架构的服务

    b/s 和 c/s架构是什么关系
    b/s架构是c/s结构的一种

    网络编程
    就是基于网络之间的两个程序要通讯

    想要实现通信
    得有 网卡 和 网线
    网卡上 有 全球唯一的 mac地址 是电脑上的身份证
    找到了mac地址,就找到了这台电脑

    规定网络地址的协议叫IP协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示。
    4个8位2进制数:00000000.00000000.00000000.00000000
    范围 0.0.0.0 - 255.255.255.255
    一个ip地址通常写成四段十进制数,例:172.16.10.1
    127.0.0.1 本地回环地址

    交换机的出现解决了多台电脑的通信问题

    网关的概念 -- 局域网中的机器想要访问局域网外的机器,需要通过网关访问

    ip地址 和 子网掩码 按位与 得到网段地址

    总结:ip协议的作用主要有两个,一个是为每一台计算机分配ip地址,另一个是确定哪些地址在同一个子网络。

    端口 为了找到计算机上的程序
    在计算机上 每一个需要网络通信的程序 都会开一个端口
    在同一时间只会有一个程序占用一个端口
    不可能在同一时间 有两个程序 占用同一个端口
    端口的范围:0-65535
    如果自己想要开一个端口 一般情况下 是 8000之后的端口

    假设 你有一个
    ip -- 你就能确定唯一一台机器
    端口 -- 确定唯一的一个程序
    既有ip 又有端口 就可以从茫茫网络中找到唯一的一台机器上的唯一的一个程序

    计算机之前的通讯
    tcp协议 和 udp协议

    TCP协议
    当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求。
    这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP将在两个应用程序之间建立
    一个全双工的通信。
    这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

    全双工:
    假设有一个client端 和 server端,c可以向s发送请求,s可以接受,
    并且s也可以向c发送请求,c接受,这就是全双工。
    (双方可以互发信息并接收)

    TCP的连接过程
    建立连接三次握手
    client------------->server 一次
    (SYN seq=x)
    <---------------- 二次
    (SYN seq=y ACK=x+1)
    ------------------> 三次
    (ACK=y+1)

    断开连接四次挥手
    client----------------->server 一次
    (FIN seq=x+2 ACK=Y+1)
    <--------------------- 二次
    (ACK x+3)
    <--------------------- 三次
    (FIN seq=y+1)
    -------------------->
    (ACK=y+2) 四次

    全双工:   =======================》  一条
    《====================== 二条

    注释:c端不想与s端建立连接了,发送了一个请求,说咱们两断开吧。
    s端回复请求,说好。这是全双工中的一条连接断开。
    这就相当于c端嘴不能说话了,但是耳朵还可以听到。这时s端还可以说话
    ,s端也发送一个请求说那我也断开吧,c端回复说好,这时全双工的另一条也断开了,
    这就完完全全的断开了,都说不了,听不到。

    为什么三次握手四次挥手?
    发起关闭的这个请求,你只能控制你自己的嘴巴,你不能去控制其他人的嘴巴。
    发起请求是,建立的肯定是一个全双工的连接,你请求我同意,我请求你同
    意,中间的那两步可以合并。
    但是断开连接时,是一个全双工的通信,你只能管理你自己,不能管理其他人,
    c端断开连接时,只是c端不能发信息了,但是s端还是可以c断发送信息的,
    所以断开连接时需要四次挥手。

    UDP协议
    当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
    当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

    tcp与udp对比
    tcp--传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器
    彼此交换数据前,必须在双方之间建立一个tcp连接,之后才能传输数据。tcp提供
    超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

    udp--用户数据协议,是一个简单的面向数据报的运输层协议。udp不提供可靠性,
    它只是把应用程序传给ip层的数据报发送出去,但是并不能保证它们能否到达目的地。
    由于udp在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发
    机制,故而传输速度很快。

    tcp就是打电话 如果传重要的东西,就用tcp
    udp就是发短信 qq用的就是udp协议 速度快

    网络的协议可以理解为是一个包快递和拆快递的过程

    应用层 (“你好”) 应用层
    传输层 (选择通信协议tcp udp) 传输层
    网络层 (ip协议 给上一层消息 网络层
    又加上了ip信息)

    数据链路层 (mac地址) 数据链路层
    物理层(网卡 网线) (网卡 网线)物理层
    顺序是:从应用层向下开始,一层一层包装,到了物理层,两个物理层之间相互连接,
    再从第二列物理层开始一层一层往上开始拆包装。

    每层运行常见物理设备
    传输层 ----》四层交换机、四层的路由器
    网络层 -----》路由器、三层交换层
    数据链路层 -----》网桥、以太网交换机、网卡
    物理层 ------》中继器、集线器、双绞线

    每层运行常见的协议
    应用层------》自己写的代码
    传输层------》tcp与udp协议
    网络层------》ip协议
    数据链路层----》arp协议
    物理层------》 网卡 网线等等

    基于tcp协议的socket
    socket套接字
    理解socket
    socket是应用层与tcp/ip协议族通信的中间软件抽象层,它是一组接口。
    在设计模式中,socket其实就是一个门面模式,它把复杂的tcp/ip协议族隐藏在
    socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,
    以符合指定的协议。

    站在我的角度看socket:
    其实socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间
    的连接和通信。
    也有人将socket说成ip+port(端口),因为ip是用来标识互联网中的一台
    主机的位置,而port是用来标识这台机器上的一个应用程序。
    所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块与之通信。

    socket套接字

    基于文件类型的套接字家族
    套接字家族的名字:AF_UNIX
    Unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,
    两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信。

    基于网络类型的套接字家族
    套接字家族的名字:AF_INET
    (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,
    要么就是已经被废弃,或者是很少被使用,或者根本没有实现,所有地址家族中,AF_INET是
    使用最广泛的一个,python支持很多种地址家族,但由于我们只关心网络编程,
    所以大部分时候我们只使用AF_INET)

    基于tcp协议的socket代码
     1 #server 端
     2 # import socket
     3 # sk = socket.socket()          # 买手机
     4 # sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  # 写这
     5              # 个是避免服务重启的时候报 address already in use 这个错
     6 # # sk.bind(("ip","port"))      # 接受的是一个元祖,里面是ip与port
     7 # sk.bind(("127.0.0.1",8080))   # 绑定手机卡
     8 # sk.listen()             # 监听
     9 #
    10 # conn,addr = sk.accept()   # 接收到别人的电话 connection 连接
    11                   #  address 地址 是别人的地址
    12 #
    13 # ret = conn.recv(1024)        # 听别人说话
    14 # print(ret)
    15 # conn.send(b"hello")        # 和别人说话 ,必须传一个bytes类型
    16 #
    17 # conn.close()             # 挂电话
    18 #
    19 # sk.close()               # 关手机
    20 # ===================================================
    21 
    22 import socket
    23 sk = socket.socket()          # 买手机
    24 sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  
    25 # 写这个是避免服务重启的时候报 address already in use 这个错
    26 # sk.bind(("ip","port"))      # 接受的是一个元祖,里面是ip与port
    27 sk.bind(("127.0.0.1",8080))   # 绑定手机卡
    28 sk.listen()             # 监听
    29 
    30 conn,addr = sk.accept()   # 接收到别人的电话 connection 连接
    31   #  address 地址 是别人的地址
    32 print(addr)
    33 while True:
    34     ret = conn.recv(1024).decode("utf-8")
    35     if ret == "bye":
    36         break
    37     print(ret)
    38     info = input(">>>")
    39     conn.send(bytes(info,encoding="utf-8"))
    40     # ret = conn.recv(1024)  # 听别人说话
    41     # print(ret)
    42     # conn.send(b"hello")  # 和别人说话 ,必须传一个bytes类型
    43     # ret = conn.recv(1024)
    44     # print(ret.decode("utf-8"))
    45     # conn.send(bytes("大碗油泼面加蛋",encoding="utf-8"))
    46 conn.close()       # 挂电话
    47 sk.close()           # 关手机
    
    
     1 # client端
     2 
     3 # import socket
     4 # sk = socket.socket()          # 买手机
     5 # sk.connect(("127.0.0.1",8080))   # 拨别人的号
     6 #
     7 # sk.send(b"python")
     8 # ret = sk.recv(1024)
     9 # print(ret)
    10 #
    11 # sk.close()
    12 # =======================================================
    13 
    14 import socket
    15 sk = socket.socket()          # 买手机
    16 sk.connect(("127.0.0.1",8080))   # 拨别人的号
    17 while True:
    18     info = input(">>>")
    19     sk.send(bytes(info,encoding="utf-8"))
    20     ret = sk.recv(1024).decode("utf-8")
    21     print(ret)
    22     if ret == "bye":
    23         sk.send(b"bye")
    24         break
    25 
    26     # sk.send(b"python")
    27     # ret = sk.recv(1024)
    28     # print(ret)
    29     # sk.send(bytes("中午吃什么?",encoding="utf-8"))
    30     # ret = sk.recv(1024)
    31     # print(ret.decode("utf-8"))
    32 sk.close()
    注:本文是根据老男孩课程内容整理而成的,本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。
     
  • 相关阅读:
    常用编码格式算法
    js显示当前时间
    客户端和服务器端乱码问题
    常用的小技巧
    开发jsp中常用标签
    java中的反射
    java中的单例设计模式
    java中的枚举类
    关于继承时构造方法的问题
    TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?
  • 原文地址:https://www.cnblogs.com/pioneerLee/p/10281179.html
Copyright © 2011-2022 走看看