精华内容
下载资源
问答
  • 网络编程就是,让不同电脑上的软件进行数据传递,即进程间通信;ip地址ip地址概念和作用IP地址是什么:比如192.168.1.1 这样的一些数字;ip地址的作用:用来在电脑中 标识唯一一台电脑,比如192.168.1.1;在本地...

    网络通信

    使用网络的目的

    把多方链接在一起,进行数据传递;

    网络编程就是,让不同电脑上的软件进行数据传递,即进程间通信;

    ip地址

    ip地址概念和作用

    IP地址是什么:比如192.168.1.1 这样的一些数字;

    ip地址的作用:用来在电脑中 标识唯一一台电脑,比如192.168.1.1;在本地局域网是唯一的。

    网卡信息

    查看网卡信息

    Linux:ifconfig

    windows:ipconfig

    ensxx:用来与外部进行通信的网卡;

    lo:环回网卡,用来进行本地通信的;

    linux关闭/开启网卡:sudo ifconfig ensxx down/up

    ip和ip地址的分类

    ip分为ipv4和ipv6

    ip地址分为:

    A类地址

    B类地址

    C类地址

    D类地址--用于多播

    E类地址--保留地址,因ipv6诞生,已无用

    私有ip

    单播--一对一

    多播--一对多

    广播--多对多

    端口

    ip:标识电脑;

    端口:标识电脑上的进程(正在运行的程序);

    ip和端口一起使用,唯一标识主机中的应用程序,进行统一软件的通信;

    端口分类

    知名端口

    固定分配给特定进程的端口号,其他进程一般无法使用这个端口号;

    小于1024的,大部分都是知名端口;

    范围从0~1023;

    动态端口

    不固定分配,动态分配,使用后释放的端口号;

    范围1024~65535;

    socket

    socket的概念

    socket是进程间通信的一种方式,能实现不同主机间的进程间通信,即socket是用来网络通信必备的东西;

    创建socket

    创建套接字:

    import socket

    soc = socket.socket(AddressFamily, Type)

    函数socket.socket创建一个socket,该函数有两个参数:

    Address Family:可选 AF_INET(用于internet进程间通信)和AF_UNIX(用于同一台机器进程间通信);

    Type:套接字类型,可选 SOCK_STREAM(流式套接字,主用于TCP协议)/SOCK_DGRAM(数据报套接字,主用于UDP套接字);

    创建tcp套接字

    import socket

    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    ...

    soc.close()

    创建udp套接字

    import socket

    soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    ...

    soc.close()

    udp

    udp使用socket发送数据

    在同一局域网内发消息;

    如果用虚拟机和windows,要用桥接模式,确保在同一局域网内;

    import socket

    def main():

    # 创建一个udp套接字

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 使用套接字收发数据

    udp_socket.sendto(b"hahaha", ("193.168.77.1", 8080))

    # 关闭套接字

    udp_socket.close()

    if __name__ == "__main__":

    main()

    udp发送数据的几种情况:

    在固定数据的引号前加b,不能使用于用户自定义数据;

    用户自定义数据,并进行发送,使用.encode("utf-8")进行encode编码

    用户循环发送数据

    用户循环发送数据并可以退出

    只贴出最后一种情况,即完整代码

    import socket

    def main():

    # 创建一个udp套接字

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    while 1:

    # 从键盘获取要发送的数据

    send_data = input("请输入你要发送的数据:")

    if send_data == "exit":

    break

    # 使用套接字收发数据

    udp_socket.sendto(send_data.encode("utf-8"), ("193.168.77.1", 8080))

    # 关闭套接字

    udp_socket.close()

    if __name__ == "__main__":

    main()

    udp接收数据

    接收到的数据是一个元组,元组第一部分是发送方发送的内容,元组第二部分是发送方的ip地址和端口号;

    import socket

    def main():

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    localaddr = ("", 8080)

    udp_socket.bind(localaddr) # 必须绑定自己电脑的ip和端口

    # 接收数据

    recv_data = udp_socket.recvfrom(1024)

    # recv_data这个变量存储的是一个元组,例如 (b"hahaha", ("192.168.77.1", 8888))

    recv_msg = recv_data[0]

    send_addr = recv_data[1]

    # print("%s 发送了:%s" % (str(send_addr), recv_msg.decode("utf-8"))) # linux发送的数据用utf8解码

    print("%s 发送了:%s" % (str(send_addr), recv_msg.decode("gbk"))) # windows发送的数据用gbk解码

    udp_socket.close()

    if __name__ == "__main__":

    main()

    udp接发数据总结

    发送数据的流程:

    创建套接字

    发送数据

    关闭套接字

    接收数据的流程:

    创建套接字

    绑定本地自己的信息,ip和端口

    接收数据

    关闭套接字

    端口绑定的问题

    如果在你发送数据时,还没有绑定端口,那么操作系统就会随机给你分配一个端口,循环发送时用的是同一个端口;

    也可以先绑定端口,再发送数据。

    udp发送消息时自己绑定端口示例

    import socket

    def main():

    # 创建一个udp套接字

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定端口

    udp_socket.bind(("192.168.13.1", 8080))

    while 1:

    # 从键盘获取要发送的数据

    send_data = input("请输入你要发送的数据:")

    if send_data == "exit":

    break

    # 使用套接字收发数据

    udp_socket.sendto(send_data.encode("utf-8"), ("193.168.77.1", 8080))

    # 关闭套接字

    udp_socket.close() # 按ctrl+c退出

    if __name__ == "__main__":

    main()

    但应注意,同一端口在同一时间不能被两个不同的程序同时使用;

    单工,半双工,全双工

    单工半双工全双工的理解

    单工:

    只能单向发送信息,别人接收,别人不能回复消息,比如广播;

    半双工:

    两个人都能发消息,但是在同一时间只能有一个人发消息,比如对讲机;

    全双工:

    两个人都能发消息,能同时发,比如打电话;

    udp使用同一套接字收且发数据

    """socket套接字是全双工"""

    import socket

    def main():

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    udp_socket.bind(("192.168.13.1", 8080))

    # 让用户输入要发送的ip地址和端口

    dest_ip = input("请输入你要发送数据的ip地址:")

    dest_port = int(input("请输入你要发送数据的端口号:"))

    # 从键盘获取要发送的数据

    send_data = input("请输入你要发送的数据:")

    # 使用套接字收发数据

    udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))

    # 套接字可以同时 收发数据;

    recv_data = udp_socket.recvfrom(1024)

    print(recv_data)

    # 关闭套接字

    udp_socket.close() # 按ctrl+c退出

    if __name__ == "__main__":

    main()

    在这里体现不出来socket是全双工,因为现在解释器只能按照流程,一步一步走下去,后面学习了进程线程协程就可以做到了。

    tcp

    tcp-可靠传输

    tcp采取的机制

    采用发送应答机制

    超时重传

    错误校验

    流量控制和阻塞管理

    tcp与udp的区别

    tcp更安全可靠,udp相对没那么安全可靠;

    面向连接

    有序数据传输

    重发丢失的数据

    舍弃重复的数据包

    无差错的数据传输

    阻塞/流量控制

    tcp,udp应用场景

    tcp应用场景:下载,发送消息

    udp应用场景:电话,视频直播等

    tcp客户端

    tcp客户端发送数据

    import socket

    def main():

    # 1.创建tcp的套接字

    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.链接服务器

    tcp_socket.connect(("193.168.11.1", 8080))

    # 3.发送/接收消息

    send_data = input("请输入你要发送的消息:")

    tcp_socket.send(send_data.encode("utf-8"))

    # 4.关闭套接字

    tcp_socket.close()

    if __name__ == "__main__":

    main()

    tcp服务器

    监听套接字,专门用来监听的;

    accept会对应新创建的套接字,当监听套接字收到一个请求后,将该请求分配给新套接字,由此监听套接字可以继续去监听了,而新套接字则为该胡克段服务。

    import socket

    def main():

    # 创建tcp套接字

    tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    tcp_service_socket.bind(("", 8080))

    # 让默认的套接字由主动变为被动

    tcp_service_socket.listen(128)

    # 等待客户端的链接

    new_client_socket, client_addr = tcp_service_socket.accept()

    print("链接的客户端地址为:", client_addr)

    # 接收客户端发送过来的请求

    recv_data = new_client_socket.recvfrom(1024)

    print(recv_data)

    # 给客户端回送消息

    new_client_socket.send("hahahah".encode("utf-8"))

    new_client_socket.close()

    tcp_service_socket.close()

    if __name__ == "__main__":

    main()

    listen里面的参数,表示同时只允许128个链接访问。

    QQ不绑定端口的运行原理-扩展

    udp和tcp并用;

    使用QQ,先登录,登录后告诉腾讯服务器此QQ运行的端口,发消息时,通过腾讯服务器转发给另一个QQ;

    不绑定端口也有一个好处,就是允许多开,即一个电脑上可以运行多个QQ;

    recv和recvfrom的区别

    recvfrom里面不仅有发过来的数据,还有发过来数据的人的信息;

    recv里面就只有数据;

    tcp客户端服务端流程梳理

    tcp服务器流程梳理

    创建服务器套接字

    绑定本地信息

    让默认的套接字由主动变为被动

    等待客户端的链接,堵塞

    被客户端链接后,创建一个新的客服套接字为客户端服务;

    接收客户端发送的消息,堵塞

    接收客户端发送的消息后,给客户端回消息

    关闭客服套接字,关闭服务端套接字

    tcp注意点

    tcp服务器一般情况下都需要綁定,否则客户端找不到这个服务器。

    tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip, port等信息就好,本地客户端可以随机。

    tcp服务器通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的。

    当客户端需要链接服务器时,就需要使用connect进行链接, udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信。

    当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务。

    liston后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的。

    关闭isten后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。

    关闭accept返回的套接字意味着这个客户端已经服务完毕。

    9.当客户端的套接字调用close后.服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过 返回数据的长度来区别客户端是否已经下线。

    tcp应用案例 ###

    示例1-为一个用户办理一次业务:

    """可以理解为银行一个客服为排队的人员办理业务"""

    import socket

    def main():

    # 1.创建tcp套接字

    tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.绑定本地信息

    tcp_service_socket.bind(("", 8080))

    # 3.让默认的套接字由主动变为被动

    tcp_service_socket.listen(128)

    while 1:

    # 4.等待客户端的链接

    new_client_socket, client_addr = tcp_service_socket.accept()

    print("链接的客户端地址为:", client_addr)

    # 接收客户端发送过来的请求

    recv_data = new_client_socket.recvfrom(1024)

    print(recv_data)

    # 给客户端回送消息

    new_client_socket.send("hahahah".encode("utf-8"))

    # 关闭套接字

    new_client_socket.close()

    tcp_service_socket.close()

    if __name__ == "__main__":

    main()

    示例2-为同一用户服务多次并判断一个用户是否服务完毕:

    """可以理解为银行一个客服为排队的人员办理业务"""

    import socket

    def main():

    # 1.创建tcp套接字

    tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.绑定本地信息

    tcp_service_socket.bind(("", 8080))

    # 3.让默认的套接字由主动变为被动

    tcp_service_socket.listen(128)

    while 1:

    # 4.等待客户端的链接

    new_client_socket, client_addr = tcp_service_socket.accept()

    print("链接的客户端地址为:", client_addr)

    # 循环目的:为同一个客户服务多次

    while 1:

    # 接收客户端发送过来的请求

    recv_data = new_client_socket.recvfrom(1024)

    print(recv_data)

    # 如果recv解堵塞,那么有两种方式

    # 1.客户端发了数据过来

    # 2.客户端调用了close

    if recv_data:

    # 给客户端回送消息

    new_client_socket.send("hahahah".encode("utf-8"))

    else:

    break

    # 关闭套接字

    new_client_socket.close()

    tcp_service_socket.close()

    if __name__ == "__main__":

    main()

    示例3-tcp文件下载客户端和服务端:

    文件下载客户端

    import socket

    def main():

    # 1.创建套接字

    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.获取服务器的ip,port

    dest_ip = input("请输入你要链接的服务器ip:")

    dest_port = input("请输入你要链接的端口:")

    # 3.链接服务器

    tcp_socket.connect((dest_ip, dest_port))

    # 4.获取下载的文件名字

    want_file = input("请输入你要下载的文件:")

    # 5.将文件名字发送到服务器

    tcp_socket.send(want_file.encode("utf-8"))

    # 6.接收要下载的文件

    file_data = tcp_socket.recv(1024)

    # 7.将接收文件的数据写入一个文件中

    if file_data:

    with open("[复件]" + want_file, "wb") as f:

    f.write(file_data)

    # 8.关闭套接字

    tcp_socket.close()

    pass

    if __name__ == "__main__":

    main()

    文件下载服务端

    import socket

    def send_file2client(new_socket, client_addr):

    # 1.接受客户端发送过来的 要下载的文件名

    want_file = new_socket.recv(1024).decode("utf-8")

    print("客户端 %s 要接收的文件为:%s" % (str(client_addr), want_file))

    # 2.读取文件数据

    file_data = None

    try:

    f = open(want_file, "rb")

    file_data = f.read()

    f.close()

    except Exception as e:

    print("你要下载的文件 %s 不存在" % want_file)

    # 3.发送文件的数据给客户端

    if file_data:

    new_socket.send(file_data)

    def main():

    # 1.创建套接字

    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.绑定本地信息

    tcp_socket.bind(("", 8080))

    # 3.套接字被动接受 listen

    tcp_socket.listen(128)

    while 1:

    # 4.等待客户端的链接 accept

    new_socket, client_addr = tcp_socket.accept()

    # 5.调用函数发送文件到客户端

    send_file2client(new_socket, client_addr)

    # 7.关闭套接字

    new_socket.close()

    tcp_socket.close()

    if __name__ == "__main__":

    main()

    展开全文
  • Python网络编程

    2019-08-07 08:16:25
    文章目录Python网络编程1.引子2.软件的开发架构C/S架构B/S架构3.什么是网络目的网络编程的定义4.地址生活中的地址与标识ip地址的作用IP地址分类A类IP地址B类IP地址C类IP地址D类地址用于多点广播E类IP地址私有ip...

    Python和网络编程

    1.引子

    假如有两个脚本foo.py,bar.py,分别运行,都可以正常运行。但是现在想从两个程序间传递一个数据。

    • 同一台电脑
      • 创建一个文件,将foo.py的数据读入文件中,bar.py从文件中读取数据。
    • 不同电脑间

    2.软件的开发架构

    C/S架构

    C/S即Client和Server —> 客户端和服务端架构

    B/S架构

    B/S即Browser和Server —> 浏览器端和服务器端架构

    3.什么是网络

    网络就是一种辅助双方或多方的能够连接在一起的工具。

    伴随着网络发展,人们使用了很多通信方法,有些已不再使用,现在使用最广泛的是TCP/IP(Transmission Control Protocol/Internet Protocol)

    TCP/IP是标准的协议,其可以使世界范围内的计算机通过Internet或本地网络进行通信。

    TCP/IP事实上是一些协议(protocols)的合集。当前大多数使用中的通信都使用TCP协议。

    Internet是在一些共享的线路上发送数据’的。例如:在您的计算机上也许同时运行着几个应用程序,如Web浏览器、通讯软件等程序,而您只须通过一条单一的线路来连接互联网。上面所有的程序都共享这个连接,简单地说,用户往往不会觉察到这个共享的发生。

    目的

    • 使用网络把多方连接在一起,然后进行数据传输
    • 为了让不同电脑的软件可以互相传递数据,借助网络的功能。

    网络编程的定义

    让不同电脑中软件能够进行数据传递,即网络中不同主机进程间的通信。

    4.地址

    生活中的地址与标识

    不同的网络中,采用唯一的标识来区分不同的主体,比如车牌号、建筑物地址、电话号码、员工编号等等

    一台电脑怎么找到很多电脑中的一台呢?

    警察怎么找到嫌疑犯的?

    ip地址的作用

    ip地址:用来在网络中标记一台电脑,好比班级编号,球队编号。

    同一网络:例如同一个局域网, 一个教室里。

    IP地址分类

    目前ip主要分为两种

    • ipv4,32位二进制构成,分成4段,每段范围0-255(2的8次方,四个字节)
    • ipv6,128位二进制构成,

    每一个IP包含两部分:

    • 网络号
    • 主机号

    类似电话号码由区号+电话主机号组成。

    (1) IPv4可提供4,294,967,296个地址,IPv6将原来的32位地址空间增大到128位,数目是2的128次方。能够对地球上每平方米提供6×1023个网络地址,在可预见的将来是不会耗尽的。   
    (2) IPv4 使用地址解析通讯协议 (ARP) ,IPv6使用多点传播 Neighbor Solicitation 消息取代地址解析通讯协议 (ARP) 。   
    (3) IPv4 中路由器不能识别用于服务质量的QoS 处理的 payload。IPv6中路由器使用 Flow Label 字段可以识别用于服务质量的 QoS 处理的 payload。      
    (4) IPv4的回路地址为: 127.0.0.1,IPv6的回路地址为 : 000:0000:0000:0000:0000:0000:0000:0001 可以简写为 ::1。   
    (5) 在IPv4中,动态主机配置协议( Dynamic Host Configuration Protocol,DHCP)实现了主机IP地址及其相关配置的自动设置。一个DHCP服务器拥有一个IP地址池,主机从DHCP服务器租借IP地址并获得有关的配置信息(如缺省网关、DNS服务器等),由此达到自动设置主机IP地址的目的。IP v6继承了IPv4的这种自动配置服务,并将其称为全状态自动配置(stateful auto configuration)。  
    (6) IPv4使用 Internet 群组管理通讯协议 (IGMP) 管理本机子网络群组成员身份,IPv6使用 Multicast Listener Discovery (MLD) 消息取代 IGMP。   
    (7) 内置的安全性。IPSec由IETF开发是确保秘密、完整、真实的信息穿越公共IP网的一种工业标准。IPsec不再是IP协议的补充部分,在IPv6中IPsec是IPv6自身所具有的功能。IPv4选择性支持IPSec,IPv6自动支持IPSec。   
    (8) 更好的QoS支持。QoS是网络的一种安全机制,通常情况下不需要QoS,但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。在IPv6 的包头中定义了如何处理与识别传输, IPv6 包头中使用 Flow Label 来识别传输,可使路由器标识和特殊处理属于一个流量的封包。流量是指来源和目的之间的一系列封包,因为是在 IPv6 包头中识别传输,所以即使透过 IPSec 加密的封包 payload,仍可实现对 QoS 的支持。

    A类IP地址

    一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,

    地址范围1.0.0.1-126.255.255.254

    二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110

    8位二进制全1就是255

    可用的A类网络有126个,每个网络能容纳1677214个主机

    B类IP地址

    一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,

    地址范围128.1.0.1-191.255.255.254

    二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110

    可用的B类网络有16384个,每个网络能容纳65534主机

    C类IP地址

    一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”

    范围192.0.1.1-223.255.255.254

    二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110

    C类网络可达2097152个,每个网络能容纳254个主机

    D类地址用于多点广播

    D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。

    它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中

    多点广播地址用来一次寻址一组计算机

    地址范围224.0.0.1-239.255.255.254

    网上视频会议、网上视频点播就是采用多点广播

    广播地址 (Broadcast Address) 是专门用于同时向同一网络中所有主机发送数据的一个地址。在使用TCP/IP 协议的网络中, 主机标识段 HOST ID 为全1 的IP 地址为广播地址,广播分组传送给 HOST ID 段所涉及的所有计算机. 例如, 对于 192.168.50.26(255.255.255.0) 网段,其广播地址为192.168.50.255, 当发出一个目的地址为 192.168.50.255 的数据时, 它将被分发给该网段上的所有计算机. 飞秋,内网通就是通过广播地址来广播数据的

    E类IP地址

    以“1111”开始,为将来使用保留

    E类地址保留,仅作实验和开发用

    私有ip

    在这么多网络IP中,国际规定有一部分IP地址是用于我们的局域网使用,也就

    是属于私网IP,不在公网中使用的,它们的范围是:

    10.0.0.0~10.255.255.255
    
    172.16.0.0~172.31.255.255
    
    192.168.0.0~192.168.255.255
    

    回路地址

    IP地址127.0.0.1~127.255.255.255用于回路测试,

    如:127.0.0.1可以代表本机IP地址,用http://127.0.0.1就可以测试本机中配置的Web服务器。

    5.网络通信过程

    2台电脑的网络

    1. 如果两台电脑之间通过网线连接是可以直接通信的,但是需要提前设置好ip地址以及网络掩码
    2. 并且ip地址需要控制在同一网段内,例如 一台为192.168.1.1另一台为192.168.1.2则可以进行通信

    使用集线器组成一个网络

    1. 当有多台电脑需要组成一个网时,那么可以通过集线器(Hub)将其链接在一起
    2. 一般情况下集线器的接口较少
    3. 集线器有个缺点,它以广播的方式进行发送任何数据,即如果集线器接收到来自A电脑的数据本来是想转发给B电脑,如果此时它还连接着另外两台电脑C、D,那么它会把这个数据给每个电脑都发送一份,因此会导致网络拥堵

    使用交换机组成一个网络

    1. 克服了集线器以广播发送数据的缺点,当需要广播的时候发送广播,当需要单播的时候又能够以单播的方式进行发送
    2. 它已经替代了之前的集线器
    3. 企业中就是用交换机来完成多台电脑设备的链接成网络的

    使用路由器连接多个网络

    通信过程(复杂)

    较为复杂的通信过程如:www.baidu.com

    1. 在浏览器中输入一个网址时,需要将它先解析出ip地址来
    2. 当得到ip地址之后,浏览器以tcp的方式3次握手链接服务器
    3. 以tcp的方式发送http协议的请求数据 给 服务器
    4. 服务器tcp的方式回应http协议的应答数据 给浏览器

    总结

    • MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号)
    • IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号)
    • 网络掩码:用来区分ip地址的网络号和主机号
    • 默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关
    • 集线器:已过时,用来连接多台电脑,缺点:每次收发数据都进行广播,网络会变的拥堵
    • 交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播
    • 路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化
    • DNS:用来解析出IP(类似电话簿)
    • http服务器:提供浏览器能够访问到的数据

    开放式系统互联参考模型(Open System Interconnection Reference Model) —>简称OSI

    这个标准定义了网络的七层框架,试图使得计算机在整个世界范围内实现互联。
    在OSI中,网络体系结构被分成下面的七层。

    • 物理层
      • 定义了通信设备的传输规范,规定了激活、维持和关闭通信节点之间的机械特性、电气特性和功能特性等。此层为上层协议提供了一个传输数据的物理媒介。
    • 数据链路层
      • 定义了数据封装以及传送的方式。这个层次的数据单位称为“帧”。数据链路层包括两个重要的子层:逻辑链路控制层(Logic Link Control,LLC)和介质访问控制层(Media Access Control,MAC)。LLC用来对节点间的通信链路进行初始化,并防止链路中断,确保系统的可靠通信。而MAC则用来检测包含在数据帧中的地址信息。这里的地址是链路地址或物理地址,是在设备制造的时候设置的。网络上的两种设备不能有相同的物理地址,否则会造成网络信息传送失败。
    • 网络层
      • 定义了数据的寻址和路由方式。这一层负责对子网间的数据选择路由,并实现网络互连等功能。
    • 传输层
      • 为数据提供端到端传输。这是比网络层更高的层次,是主机到主机的层次。传输层将对上层的数据进行分段并进行端到端传输。另外,还提供差错控制和流量控制机制。
    • 会话层
      • 用来为通信的双方制定通信方式,包括建立和拆除会话。另外,此层将会在数据中插入校验点来实现数据同步。
    • 表示层
      • 为不同的用户提供数据和信息的转换。同时还提供解压缩和加解密服务。这一层保证了两个主机的信息可以互相理解。
    • 应用层
      • 控制着用户绝大多数对于网络应用程序的访问,提供了访问网络服务的接口。

    [外链图片转存失败(img-gnIjQKoa-1565136943679)(D:\360安全浏览器下载\Python暑期班\data\QQ图片20190805151745.png)]

    6.端口

    整个网络通信通过IP地址+端口来标识不同的网络服务。

    端口是用来表示区别网络中不同的应用,操作系统会对端口进行编号,即端口号。

    • 端口号使用16位,也就是2个字节的数字来标识,范围021610-2^{16}-1(0-65535)

    端口的分配是基于一定规则的,而不是随意分配的。

    知名端口

    80,分配给http服务的
    21,分配给ftp服务
    

    动态端口(Dynamic Ports)

    一般不固定分配某种服务,动态分配。范围:1024-65535

    所谓的动态分配,是指一个程序需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供其使用。关闭程序时,同时释放占用的端口。

    端口查看

    netstat -ano
    

    7.Socket简介

    不同电脑上进程的标识与识别

    用唯一标识来标记一个进程。

    在电脑上,可以通过用进程号(PID)来唯一标识进程。但是在网络上,不可以。需要利用TCP/IP协议族来帮我们解决问题。

    用IP可以唯一标识网络中的主机,协议+端口号唯一标识主机中的应用进程

    进程指的是,运行的程序以及运行程序用到的资源的整体就称之为进程。

    什么是Socket?

    Socket(套接字)是进程间通信的一种方式。

    与其他进程通信的一个主要不同是:

    它能使不同主机间的进程通信,现行大多数服务都是基于Socket来完成通信的。

    比如:浏览网页,QQ聊天,收发Email。

    创建一个Socket

    import socket
    socket.socket(AddressFamily,Type)
    

    参数说明:

    • AddressFamily地址族

      • AF_INET,Internet进程间通信,实际工作最常用。
      • AF_UNIX,同一台机器进程间通信
    • Type套接字类型

      • SOCK_DGRAM,数据报套接字,主要用于UDP协议
      • SOCK_STREAM,流式套接字,主要用于TCP协议

    创建一个TCP Socket

    import socket
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.close()
    

    demo:

    ##server.py
    import socket
    #创建一个socket对象
    serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #主机名
    host = socket.gethostname()
    #端口号
    port = 9998
    #绑定端口
    serversocket.bind((host,port))
    #设置最大连接数,超过后排队
    serversocket.listen(5)
    
    while True:
        #建立客户端连接
        clientsocket,addr = serversocket.accept()
        print("连接地址:\t %s" % (str(addr)))
        msg = "网络编程测试."+"\r\n"
        clientsocket.send(msg.encode("utf-8"))
        clientsocket.close()
        
    ##client.py
    import socket
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # print(dir(s))
    #获取本地主机名
    host = socket.gethostname()
    #设置端口号
    port = 9998
    #连接服务,指定主机和端口
    s.connect((host,port))
    #接收小于1024字节的数据
    msg = s.recv(1024)
    s.close()
    print(msg.decode('utf-8'))
    
    #结果:
    #server	---> 连接地址:	 ('221.231.130.70', 58609)
    #client ---> 网络编程测试.
    

    Socket 对象(内建)方法

    函数 描述
    服务器端套接字
    s.bind() 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
    s.listen() 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
    s.accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来
    客户端套接字
    s.connect() 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
    公共用途的套接字函数
    s.recv() 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
    s.send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
    s.sendall() 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
    s.recvform() 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
    s.sendto() 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
    s.close() 关闭套接字
    s.getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
    s.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port)
    s.setsockopt(level,optname,value) 设置给定套接字选项的值。
    s.getsockopt(level,optname[.buflen]) 返回套接字选项的值。
    s.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
    s.gettimeout() 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
    s.fileno() 返回套接字的文件描述符。
    s.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
    s.makefile() 创建一个与该套接字相关连的文件

    8.UDP网络程序

    UDP —> User Data Protocol(用户数据报协议),是一个无连接的简单的面向数据报的运输层协议。

    优缺点:

    • 优点
      • 传输数据快(UDP在传输时无需在客户端和服务器端之间建立连接,也无超时重新发送机制)
    • 缺点
      • 不能保证可靠性(UDP是一种面向无连接的协议,每个数据都是一个独立的信息,包含完整的源地址或者目的地址,在网络上任何可能的路径传往目的地。因此是否能够到达目的地,以及到达目的地的时间和内容的正确性无法保证。)

    特点:

    UDP是面向无连接的通信协议;

    UDP包括目的端口号和源端口号信息,通信不需要连接能够实现广播发送。

    UDP数据大小有限制,每个被传输的数据报必须限定在64K以内。

    UDP是一个不可靠的协议。发送出去的数据报不一定以相同次序到达接收方。

    UDP一般多用于多点通信和实时的数据业务。比如:

    • 视频
    • QQ
    • 语音广播等

    发送数据

    创建一个UDP客户端程序的流程:

    1.创建一个客户端套接字

    2.发送/接收数据

    3.关闭套接字

    socket和file的区别:

    • file针对指定模块进行“打开”,“读写”,“关闭”

    • socket针对服务端和客户端socket进行“打开”,“读写”,“关闭”

    demo:

    import socket
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr = ("221.231.130.70",8234)
    sendData = input("请输入要发送的数据:")
    udp_socket.sendto(sendData.encode("gbk"),addr)
    udp_socket.close()
    

    接收数据

    demo:

    import socket
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr = ("192.168.1.112",8345)
    sendData = input("请输入发送数据:")
    udp_socket.sendto(sendData.encode("utf-8"),addr)
    recvData = udp_socket.recvfrom(1024)
    print(recvData)
    udp_socket.close()
    

    用网络调试助手时,端口号会一直变动。

    UDP端口号绑定

    一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定

    但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢?

    如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定

    [外链图片转存失败(img-qboUymIX-1565136943680)(D:\360安全浏览器下载\Python暑期班\data\QQ图片20190805151759.png)]

    import socket
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    local_addr = ("",7790)  #ip地址和端口号,ip一般不用写,表示本地ip
    udp_socket.bind(local_addr)
    
    recv_Data = udp_socket.recvfrom(1024)
    while True:
        if recv_Data[0].decode("gbk") == "quit()":
            break
        else:
            print(recv_Data[0].decode("gbk"))
            recv_Data = udp_socket.recvfrom(1024)
    udp_socket.close()
    

    总结:

    • 一个UDP网络程序,可以不绑定端口,此时系统会自动分配一个端口。重新运行此程序,端口号可能会发生变化。
    • 一个UDP网络程序,可以绑定信息(IP,Ports),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的。

    9.TCP简介

    [外链图片转存失败(img-G8qYZW7p-1565136943680)(D:\360安全浏览器下载\Python暑期班\data\QQ图片20190805172610.png)]

    TCP协议,传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    TCP通信需要经过创建连接,传输数据,终止连接三个步骤。

    TCP特点

    面向连接

    通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

    双方间的数据传输都可以通过这个连接进行。

    完成数据交换后,双方断开此连接,以释放系统资源。

    这种连接是一对一的

    因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议

    可靠传输

    1)TCP采用发送应答机制

    TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

    2)超时重传

    发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

    TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

    3)错误校验

    TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

    1. 流量控制和阻塞管理

    流量控制用来避免主机发送得过快而使接收方来不及完全收下。

    TCP和UDP的不同点

    • 面向连接
    • 有序的数据传输
    • 无差错的数据传输(会重发丢失的数据包,舍弃重复的数据包)
    • 阻塞/流量控制
    • TCP通信模型,类似“打电话”,在通信开始前,一定要先建立相关连接,才能发送数据;而UDP通信模型,类似“写信”,不需要建立相关连接,只需要发送数据即可。

    在Python中,用TCP进行Socket编程也比较简单。

    • 客户端
      • 要主动连接服务器的IP和指定端口
    • 服务器
      • 监听指定端口
      • 对于每一个新的连接,创建一个线程或者进程。

    通常,服务器程序可以无限运行下去。要注意的是,一个端口不能同时被两个socket绑定。

    TCP服务端和客户端的socket的创建和交互

    [外链图片转存失败(img-FjH0lDjy-1565136943681)(D:\360安全浏览器下载\Python暑期班\data\QQ图片20190805151745.png)]

    TCP服务器

    在Python程序中,如果要完成一个tcp服务器的功能,需要的流程如下:

    • 1.socket创建一个套接字
    • 2.bind()
    • 3.listen()使套接字由主动变为被动连接,即开启监听模式
    • 4.accept()等待客户端的连接
    • 5.recv/send接收/发送数据
    • 6.关闭和客户端交互的套接字
    • 7.关闭监听套接字

    tcp_server

    import socket
    #创建套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #绑定本地信息
    tcp_socket.bind(("",8080))    # port num > 1024的随意用,< 1024的一般指定了用途
    #设置监听
    tcp_socket.listen(5)
    #创建新的套接字
    new_socket,addr = tcp_socket.accept()
    #收/发数据
    content = new_socket.recv(1024)
    print("接收到的数据:",content.decode("gbk"))
    data = input("服务器发送的数据:")
    new_socket.send(data.encode("gbk"))
    #关闭通信的socket
    new_socket.close()
    #关闭用于监听的关键字
    tcp_socket.close()
    

    设置监听的目的:

    socket默认为主动模式,listen()能够将主动模式改为被动模式。被动了才能接收信息,listen(5)是指可以同时接收到的客户端申请的最大数,超过则拒绝连接。

    创建新套接字的原因:

    服务器接收到请求后,将生产一个新的套接字,专门给新来的客户端提供一对一的服务。此时,服务器套接字的任务就是,等待新的客户端套接字连接它

    tcp_client

    import socket
    #创建套接字
    tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #目标服务器信息
    server_ip = input("请输入服务器IP:")
    server_port = int(input("请输入服务器port:"))
    tcp_client_socket.connect((server_ip,server_port))
    #提示用户输入数据
    send_data = input("请输入要发送的数据:")
    tcp_client_socket.send(send_data.encode("utf-8"))
    #接收服务器端发回的信息
    recv_data = tcp_client_socket.recv(1024)
    print("接收到的数据为:",recv_data.decode("gbk"))
    #关闭套接字
    tcp_client_socket.close()
    

    TCP注意点

    1. tcp服务端一般情况下都需要绑定,否则客户端找不到这个服务端
    2. tcp客户端一般不绑定,因为是主动连接服务端,所以只要确定好服务端的ip、port等信息就好,本地客户端可以随机
    3. tcp服务端中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务端时必须要做的
    4. 当客户端需要连接服务端时,就需要使用connect进行连接,udp是不需要连接的而是直接发送,但是tcp必须先连接,只有连接成功才能通信
    5. 当一个tcp客户端连接服务端时,服务端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
    6. listen后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept返回的新套接字是标记这个新客户端的
    7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够连接服务端,但是之前已经连接成功的客户端正常通信。
    8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
    9. 当客户端的套接字调用close后,服务端会recv解堵塞,并且返回的长度为0,因此服务端可以通过返回数据的长度来区别客户端是否已经下线

    TCP协议

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

    TCP的6个标志位

    所谓标志位,一种二进制的指令

    • SYN:发起一个新连接
    • FIN:释放一个连接
    • ACK:确认

    [外链图片转存失败(img-pQ4ZUhAg-1565136943681)(D:\360安全浏览器下载\Python暑期班\data\image.png)]

    TCP三次握手

    TCP是因特网的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方的回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接。

    TCP三次握手过程

    • 客户端发送SYN(seq = x)报文交给服务器端,进入SYN_SEND状态;
    • 服务器端收到SYN报文,会因一个SYN(seq = y)+ACK(x + 1)报文,进入SYN_RECV状态;
    • 客户端收到服务器端的SYN报文,回应一个ACK(y + 1)报文,进入Established状态。

    三次握手完成,TCP客户端和服务器端成功建立连接,可以开始传输数据。

    TCP四次挥手

    建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这个是由TCP的半关闭(Half-close)造成的。

    • 1.某个应用进程首先调用close(),称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN字节,表示数据发送完毕。
    • 2.接收到这个FIN的对端执行“被动关闭”(passive close),这个FIN由TCP确认。

    注意:

    FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相关的连接上再无额外数据可接收

    • 3.一段时间后,接收到这个文件结束符的应用进程将会调用close()关闭它的套接字。这导致它的TCP也发送一个FIN。

    • 4.接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。(既然每端都需要一个FIN和一个ACK,因此,通常需要4个字节)。

    • 广播:主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

    • arp协议:地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

    先调用close(),称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN字节,表示数据发送完毕。

    • 2.接收到这个FIN的对端执行“被动关闭”(passive close),这个FIN由TCP确认。

    注意:

    FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相关的连接上再无额外数据可接收

    • 3.一段时间后,接收到这个文件结束符的应用进程将会调用close()关闭它的套接字。这导致它的TCP也发送一个FIN。

    • 4.接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。(既然每端都需要一个FIN和一个ACK,因此,通常需要4个字节)。

    • 广播:主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

    • arp协议:地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

    • 局域网:局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。

    展开全文
  • python 网络编程

    2018-05-16 19:50:00
    1,网络编程基础:  什么是网络编程:在网络上对电脑和电脑,数据与电脑,电脑和数据之间的传输处理。  从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用   2,网络编程的基础:  网络编程...

    1,网络编程基础:

      什么是网络编程:在网络上对电脑和电脑,数据与电脑,电脑和数据之间的传输处理。

              从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用

     

    2,网络编程的基础:

      网络编程分为引用类和web类

      b/s架构也是c/s架构的一种,

      c/s架构:一般都是客户端和服务器端架构

      b/s架构:单纯的游览器端口和服务器端口的架构,优势统一了所有应用的入口

     

    3,mac地址和ip地址的区别

      mac地址是什么:所有的网卡出产后的固定编码,每个硬件网卡都有固定的mac地址,基本的格式为十二位不定编码

      ip地址是什么:所有电脑联通网络后,网关给予的一个网路地标,便于网络连通,类似于一种身份证的标识。

      ip地址代表了电脑在网络中的一个位置,十进制的四位点。

      范围是0.0.0.0--255.255.255.255

    4,网卡

      交换机:同一个局域网内的机器之间的交换

      路由器:跨局域网之间的交流用硬件

      网关ip:通过网关ip通信连接网络世界

    5,子网掩码

      

    子网掩码
        网络地址ip和子网掩码ip做按位与运算 如果结果相同 那么说明在同一个网段内
    192.168.12.62
    11000000.10101000.00001011.00111110
    11111111.11111111.11111111.00000000
    11000000.10101000.00001011.00000000   == 192.168.0.0
    255.255.0.0
    
    192.168.11.94
    255.255.0.0
    11000000.10101000.00001011.01011110
    11111111.11111111.11111111.00000000  == 192.168.0.0
    

     6,端口的概念:

       在同一时刻每个端口只能为一个运行中的程序提供服务,只有网络传输中才有端口被分配出来于网络端口相匹配,进行传输工作。

       端口的范围是 0 - 65535 个端口,平常编写中常用9000-10000端口就足够了

       1,ip+端口的概念,利用ip加端口可以精准的找到另外一台电脑(在不可以隐藏ip的情况下),255**4是所有ip的总量,42亿个地址,已经足够世界上所有的电脑网口的使用

       2,所以端口是网络传输中必不可少的一步。

     

    7.tcp和udp协议:

      tcp和udp协议都是在网络传输中的两个方式协议,协议就是一种通用的规定,

        tcp协议主要用于传输大量的数据,可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。

        使用TCP的应用:Web浏览器;电子邮件、文件传输程序

        udp协议主要用于简短的信息I/O,不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。

        使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)

     

    8.osi五层模型:

      应用层,传输层,网络层,数据链路层,物理层

     

    转载于:https://www.cnblogs.com/wpcbk/p/9047265.html

    展开全文
  • 学习python网络编程首先需要知道以下基本知识: 1.IP地址 IP地址是指互联网协议地址(Internet Protocol Address),用来给Internet上的电脑一个编号。 IP地址的作用:用来在网络中标记一台电脑。 私有IP:有一部分...

    学习python网络编程首先需要知道以下基本知识:

    1.IP地址

    IP地址是指互联网协议地址(Internet Protocol Address),用来给Internet上的电脑一个编号。

    IP地址的作用:用来在网络中标记一台电脑。

    私有IP:有一部分地址用于局域网使用,属于私网IP,范围:

    10.0.0.0~10.255.255.255 (内网,虚拟机中常出现,A类)
    
    172.16.0.0~172.31.255.255(内网、子网,B类)
    
    192.168.0.0~192.168.255.255(内网、子网,C类)

    特殊的IP地址:127.0.0.1

    127.0.0.1代表本机IP地址,用http://127.0.0.1可以测试本机中配置的Web服务器。

    特殊的域名:localhost

    localhost是本机域名,用来解析到本机127.0.0.1 ip地址上。

    IPv4与IPv6:

    IPv4,是互联网协议(Internet Protocol,IP)的第四版,也是第一个被广泛使用,构成现今互联网技术的基石的协议。采用“点分十进制”表示(如:192.168.1.100),一共有2^32-1个,估算约为42.9亿个,除去一些特用的IP和一些不能用的IP,剩下可用的不到40亿。IPv4发展到现在,最大的问题是网络地址严重不足。

    IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议。采用“点分十六进制”表示(如:2031:0000:1F1F:0000:0000:0100:11A0:ADDF),而IPv6中IP地址的长度为128,即有2^128-1个地址,号称能够为“地球上每一粒沙子分配一个IP地址”

    查看或配置网卡信息:

        Linux下在终端里输入:ifconfig ,会显示所有网卡信息

        修改局域网内某一网卡的ip:sudo ifconfig 网卡名 修改后的ip

    测试远程主机的连通性:ping IP/域名

    ping 127.0.0.1 检查本地网卡是否正常

    ping www.baidu.com 检查网卡是否能上公网

    ping 当前局域网内的ip地址 检查是否在同一个局域网内

    2.端口

    一个电脑上运行着多个应用程序,都需要收发数据,通过给每个程序分配一个端口,使程序数据收发正常。由于有很多端口,OS为了统一管理,所以进行了编号。

    端口号:使用唯一一个编号来标识端口,就是标识端口的一个编号,在Linux中共有65536个。

        端口号是OS按照一定的规定进行分配,分为知名端口号和动态端口号:

        知名端口号:系统程序使用的端口号,0~1023

        如:80端口分配给HTTP服务,21端口分给FTP服务

       动态端口号:开发应用程序使用的端口号,因为它不固定分配某一种服务,而是动态分配,所以称为动态端口,1024~65535。      

    查看端口号:

    netstat -an

    查询80端口的使用情况:

    netstat -an | grep 80  

    查看端口号被哪个程序占用:

    sudo lsof -i :80

    查看服务器socket:

    netstat -ntl

     

    需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用“80”端口与你的电

    脑通信,但你的电脑则可能使用“9054”这样的端口。

    ip地址相当于一栋房子的地址,应用程序相当于房子里的房间,而端口就相当于进入该房子的门,端口号就是门牌号。

    网络通信的流程是先通过ip地址找到网络中的设备,再通过端口号来找到对应的端口,然后把数据传输给对应的应用程序。

    IP地址与网络服务的关系是一对多的关系,网络服务实际上是通过IP地址+端口号来区分不同的服务。

    3.数据的编码和解码

    python3编码转换:文本总是Unicode,由str类型进行表示,二进制数据使用bytes进行表示,

    网络中数据的传输是以二进制(字节码)的方式来进行的,所以,我们需要通过对Unicode字符串内容ji进行编码和解码

    才能达到数据传输的目的。在python中:可以通过encode()和decode()来对数据进行编码和解码。

    声明格式为:

    str.encode(encoding="utf-8",errors="struct")

    bytes.decode(encoding="utf-8",errors="strict")

    encoding是指在编码解码过程中使用的编码,errors是指错误的处理方案。

    • encoding -- 可选参数,要使用的编码,默认编码为 'utf-8'。
    • errors -- 可选参数,设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore',表示忽略不合适的编码数据。 

     

    展开全文
  • PYTHON 网络编程

    2018-10-09 21:56:15
    1.网络编程理论基础 1.1概述 1.1.1. 什么是网络 1. 网络的由来 早期的计算机都是独立的一台一台以数据运算为主的机器,随着时代的发展,运算的数据的共享需求变得迫切,为了解决这一个问题,就有了网络的产生,通过...
  • python网络编程

    2019-09-30 01:08:16
    网络开发两大框架 c/s 架构 client server b/s 架构 BRower server c/s架构 B/S 架构 基础概念 一台主机两个重要标识 (1)mac地址:标记一台机器的物理地址 (不可变) (2)ip地址:标记一台机器的逻辑...
  • 目录 python网络编程01/网络协议 1.C/S、B/S架构 2.网络通信原理 3.简单串联五层协议以及作用 1.物理层 2.数据链路层 3.网络层 4.传输层 5.应用层 6.总结 ...
  • python网络编程之ip地址 该文档仅用作学习笔记,转载请表明出处 什么是地址 地址就是用来标记地点的 ip地址的作用 ip地址:用来在网络中标记一台电脑的一串数字,比如192.168.1.1;在本地局域网是唯一的。 ip地址的...
  • 作用:相应操作并显示结果,想数据库请求数据 要求:美观、操作简单方便 数据库 作用存储数据,检索数据、生成新的数据 要求:统一、安全、性能。 Oracle Oracle公司的产品 产品免费、服务费收费 Sql serv
  • Python网络编程:ZeroMQ

    2021-04-17 16:03:04
    ZeroMQ(又名ØMQ,MQ,或zmq)像一个可嵌入的网络库,但其作用就像一个并发框架。 ZeroMQ类似于标准Berkeley套接字,其提供了各种传输工具,如进程内、进程间、TCP和组播中进行原子消息传送的套接字。 可以使用各种...
  • Python网络编程 —— IP、UDP IP ip地址: 在网络中标识一台唯一的设备 ip地址的作用: 通过ip地址在网络中找到对应的设备,然后可以给这个设备发送数据 ip地址分为:ipv4 ipv6 域名:方便记忆某台电脑的主机...
  • python网络编程之进程

    2019-09-28 05:43:48
    背景知识 顾名思义,进程即一个软件正在进行的过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统...#一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口...
  • Python网络编程(二)

    2019-06-07 18:47:00
    网络编程基础 计算机网络功能主要包括实现资源共享,实现数据信息的快速传递。 OSI七层模型 制定组织: ISO(国际标准化组织) 作用:使网络通信工作流程标准化 应用层 : 提供用户服务,具体功能有应用程序...
  • Python 网络编程(进阶)TCP协议1. 预备知识分包粘包2. TCP协议2.1 TCP协议的作用分包:TCP传输的“特性”2.2 TCP 数据包的大小2.3 TCP数据包的编号(SEQ)2.4 TCP数据包的组装2.5 慢启动和 ACK2.6 数据包的遗失处理...
  • 1.什么是网络编程? 答:网络编程也叫做socket编程即套接字编程,基于遵循socket套接字的规定进行的编程 2.什么是socket? 答:socket就是一组简单的接口!socket抽象层位于TCP运输层和应用层之间,socket抽象层将...
  • IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。 IP地址 IP地址分为两类:IPV4和IPV6 IPV4为最常用地址,由32位二进制组成,为了方便记忆一般写成4位十进制用...
  • 目录 一、urllib ...urllib库的作用:网页爬虫、自动化处理表单、自动化测试脚本(如sqlmap 1.获取网页内容 根据url获取网页信息、网页信息实质是一段html、css、js代码 python2的代码,获取百度...
  • Python3 网络编程

    2019-08-01 01:26:51
    文章目录程序运行环境简介网络编程的概念和作用TCP/IP简介TCP编程客户端服务器小结UDP编程小结总结 程序运行环境简介 系统:macOS catalina beta3 Pythonpython3.7.0 网络编程的概念和作用 计算机网络的作用是将各...
  • 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结。  了解c语言的人,一定会...
  • python 网络编程第三版

    2016-01-02 17:13:00
    ***这个版本并没有真正的起到多线程的作用,主要原因在于t.join();以后的版本会改进这个问题*** #!/usr/bin/python #!coding:utf-8 import os,sys,time from socket import * import threading def ...
  • 现代计算机系统是由一/多个处理器,主存,磁盘,打印机,键盘,鼠标,显示器,网络接口及各种其他输入输出设备组成的复杂系统,不可能掌握所有系统实现的细节,且管理优化这些部件是难度极大。所以需要为计算机安装一层软件,...
  • python3 网络编程

    2019-02-13 23:10:45
    注:网络编程并非是python独有的 一、网络编程  1.网络的功能:数据的传输  2.iso:国际标准化组织,非盈利公益机构,制定了osi七层模型  作用:使网络通信工作流程标准化。  osi七层模型:  应用层:...
  • 作用:我们只需要安照socket的规定去编程,就不需要深入理解tcp/udp协议也可以实现 1:TCP协议 1.1客户端服务端循环收发消息 # 1:引入stock模块(导包) import socket #2:创建服务端对象 tcp_server = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 417
精华内容 166
关键字:

python网络编程作用

python 订阅