python高级之网络概述1

2.1TCP/IP协议简介

TCP/IP协议是一个协议族

分层:

(1)四层:链路层——网络层——传输层——应用层

(2)七层:物理层——数据链路层——网络层——传输层——会话层——表示层——应用层

2.2端口

(1)用端口来区分进程。在linux系统中,端口可以有65536(2的16次方)个

2)端口号:端口是通过端口号来标记的,端口号只有整数,范围是从0到65535

注意:端口号不能重复

(3)知名端口(固定端口):是系统使用的端口

         知名端口是众所周知的端口号,范围从0到1023。

              80端口分配给HTTP服务

              21端口分配给FTP服务

(4)动态端口:动态端口的范围是从1024到65535

(5)查看端口

用“netstat -an”查看端口状态

lsof -i [tcp/udp]:端口号 表示可以通过端口号找到应用程序,如果根据端口号找不到应用程序,可以尝试在命令前加上sudo

2.3ip地址

(1)在网络中标识唯一的一台设备

(2)ip地址分为ipv4和ipv6

(3)ip地址的作用:通过Ip地址找到对应的设备,然后给设备发送数据

(4)私有ip:在局域网中使用的ip地址

(5)本机ip地址:127.0.0.1,本机域名:localhost

(6)域名和ip地址一一对应,每一个域名都能解析出来一个对应的ip地址,域名能方便大家记忆某台电脑的主机地址

网络通信流程:通过ip地址找到对方的设备,通过端口号找到对应端口,然后通过端口把数据给应用程序

2.4socket(套接字)

socket是不同电脑进程之间通信的工具,是负责把数据从一方搬运到另一方,完成数据的共享

创建socket:

import socket

s = socket.socket(AddressFamily, Type)

s.close()

说明:

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

  • Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
  • Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

总结:

套接字使用流程与文件的使用流程很类似

    1. 创建套接字
    2. 使用套接字收/发数据
    3. 关闭套接字

例子:用socket进行数据发送和接收

import socket
# 判断是否是程序入口
if __name__ == '__main__':
    # 创建udpsocket
    # 1. AF_INET: ipv4地址类型
    # 2. SOCK_DGRAM: udp传输协议
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 准备发送数据
    send_content = "哈哈,今天学习了socket"
    # 注意点: socket收发数据必须是二进制数据
    # 把字符串编码成一个二进制数据
    send_data = send_content.encode("gbk")
    # 发送数据
    # 如果使用的window网络调试助手,那么这个网络调试助手使用gbk进行解码的,所有我们使用gbk进行编码
    # 提示: 乌版图网络调试助手解码使用utf-8
    udp_socket.sendto(send_data, ("192.168.131.86", 9090))
    # 接收数据, 1024:表示每次接收数据的最大字节数
    # 注意点:recvfrom会阻塞程序,接收到数据以后程序解阻塞代码才可以继续往下执行,否则一定等待对方发送数据
    recv_data, ip_port = udp_socket.recvfrom(1024)
    # 对二进制数据进行解码转成对应的字符串
    recv_content = recv_data.decode("gbk")
    # sep:按照指定的标识符进行分割显示数据
    print(recv_content, ip_port, sep="&")
    # 关闭套接字
    udp_socket.close()

2.5python3编码解码

str->bytes:encode编码 bytes->str:decode解码

其中decode()与encode()方法可以接受参数,其声明分别为:

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

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

其中的encoding是指在解码编码过程中使用的编码(此处指“编码方案”是名词),errors是指错误的处理方案。errors默认="strict"。errors="ignore"表示忽略编码不成功的字符

2.6udp绑定端口号问题

如:

udp_socket.bind(("", 7878))

# "": 表示本机的任意一个ip地址,建议不需要指定死ip地址

# 不指定ip地址目的是兼容多个网卡的问题

2.7tcp简介

(1)udp: 用户数据报协议,全拼: User Datagram Protocol, 它是不面向连接,不是可靠的传输协议,但是它的传输速度快

只要把socket准备好不需要建立连接就可以收发消息了

(2)tcp: 传输控制协议,全拼:Transmission Control Protocol, 它是面向连接,可靠的传输协议

tcp发送数据的流程, ①建立连接②收发数据③终止连接

tcp和udp都是传输层协议

2.8tcp的特点

(1)面向连接,间接验证ip地址的有效性

(2)可靠传输协议

①应答机制:发送完数据以后,对方收到数据底层会回复

② 超时重传:比如发送数据包以后对方没有回复,会隔一段时间再次向对方发送数据,如果循环几次对方一直不回复表示对方已经掉线了

③ 错误校验:发送的数据包和收到数据包的序号有可能不一致,那么tcp会自动根据序号进行排序,保证数据的有效性和有序性,还有一个特点会删除重复的数据包

④流量控制:tcp能够保证网卡缓冲区不会写满,达到一定上限不会让对方再发送数据了,等开始接收数据以后再发送,保证对方电脑不会卡死,提示:udp死循环一直给对方发送数据,如果对方没有来得及,一直接收数据会卡死电脑

2.9tcp注意点

(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,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

2.10tcp和udp的不同点

(1)tcp面向连接的, udp不面向连接

(2)tcp是可靠的传输协议,udp是不可靠的传输协议,但是传输速度快

(3)tcp能保证数据有序和有效性,udp不保证,有可能出现丢包和数据错乱问题

(4)tcp超时重传,udp没有

(5)tcp能够删除重复的数据包,udp没有该功能

(6)tcp有流量控制,udp没有

(7)tcp适合发送大量数据, 理论上没有限制,udp每次发送的数据包上限是64k

(8)tcp需要建立连接资源耗费的比较大,udp不需要建立连接资源耗费比较少,udp传输速度比tcp传输速度要快

(9)tcp的应用场景:比如文件上传和下载以及浏览器上网和大多数应用程序都是采用tcp协议,udp应用场景:发送广播消息(飞秋),音视频传输(qq,微信)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值