高级编程—02网络编程

本文详细介绍了网络通信的基本概念,重点讲解了TCP/IP协议,包括协议的意义、TCP/IP协议族、IP地址分类和相关概念。接着,深入探讨了Socket编程,包括网络进程间通信、Socket的创建、UDP和TCP的特性及其网络程序实现。最后,提到了并发服务器的模型和两个基于Socket的案例——模拟浏览器获取页面内容和简易Web服务器的实现。
摘要由CSDN通过智能技术生成

一、网络通信概述

1、什么是网络

网络是一种辅助双方或者多方能够连接在一起的工具
如果没有网络,单机的世界是所么的孤独啊

2、使用网络的目的

联通多方然后进行通信用的,即把数据从一方传递给另一方
用网络能够把多方连接在一起,然后可以进行数据传递
网络编程就是:让不同的电脑上的软件能够进行数据传递,即进程之间的通信
在这里插入图片描述

二、TCP/IP协议

1、协议

如何实现网络通信:通过协议
协议:大家彼此都认可的一个条款
比如,有的人说英语,有的人说中文,有的人说德语,说同一种语言的人可以交流,不同的语言之间就不行了。为了让解决不同种族人之间的语言沟通障碍,就规定国际通用语言是英语,这就是一个规定,就是协议

那么不同种类之间的计算机(windows、linu、mac)是怎么进行数据传递的呢,网络通信的协议是什么呢?
就像说不同语言的人沟通一样,只要有一种大家都认可都遵守的协议即可,那就是计算机遵守的网络通信协议:TCP/IP协议

2、TCP/IP协议(族)

(1)互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以大家把互联网协议简称为TCP/IP协议

在这里插入图片描述

(2)IP地址

地址就是用来标记地点的
IP地址是用来在网络中标记一台电脑的一串数字
比如:192.168.1.1
在本地局域网中,IP地址是唯一的

IP地址的分类:
每一个IP地址包括两部分:网络地址,主机地址
对于一个IP地址:172.25.254.1/24
IPV4是点分十进制,一共有32位,分为4段,每段8位,每段的范围是0~255
在172.25.254.2/24中,/24代表网络地址有24位,也就是说前三段 172.25.254是网络地址,剩下的一段 1是主机地址

IP地址可以分为5类:
在这里插入图片描述

3、一些概念

(1)子网掩码(Net mask):
子网掩码不能单独存在,它必须结合IP地址一起使用
子网掩码的作用:将某个IP地址划分成网络地址和主机地址两部分
子网掩码的设定必须遵循一定的规则,用来判断两个IP是否在同意个网络
子网掩码可以表示为两种形式:
比如:255.255.255.0,或者是24
255.255.255.0它转换成二进制是11111111 11111111 111111110就等价于24,也就是说IP地址的前24位是网络地址

如果两个IP地址的网络地址相同,那么这两台主机就可以进行通信
例如:
A主机:172.25.254.18/24
B主机:172.25.0.10/24
它俩的网络地址是前24位,明显不同,所以不能通信
如果是
A主机:172.25.254.18/16
B主机:172.25.0.10/16
网络地址是前16位,相同,则可以进行通信

(2)私网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

(3)回环地址IP:
IP地址172.0.0.1代表本机IP地址,等价于localhost
用http://127.0.0.1就可以测试本机中配置的Web服务器

(4)端口:
我们常见的的一些服务和它的端口号
sshd(22)、mysql(3306)、redis(6379)、http(80)、https(443)

端口就好比一个房子的门,是进入这间房子的必经之路
端口号只有整数,范围是0 ~ 65535

端口是唯一标识计算机上的进程,便于不同计算机进程之间进行交流,
为什么不用PID来表示呢,因为当我关闭一个进程再打开的时候,PID是会改变的

查看规定好的服务的端口号:
cat /etc/services | less

三、socket编程

1、网络进程间通信

本地进程间通信:
相同主机之间进行进程间通信的方式有:管道、消息队列、同步(互斥锁、条件变量等)

网络进程间通信:

本地通过进程的PID来唯一标识一个进程,在网络中如何唯一标识一个进程呢?

网络层的 “IP地址” 可以唯一标识网络中的主机,而传输层的 “协议+端口”可以唯一标识主机中的 应用程序(进程)。
因此利用IP地址,协议,端口 就能标识网络的进程。

2、什么是socket

socket,简称套接字,是进程间通信的一种方式,能实现不同主机之间的进程的通信。我们网络上各种各样的服务大多是基于socket来完成通信的

3、创建socket

在python中使用socket模块中的socket()函数就可以完成:socket.socket(family , type)

socket.socket(family , type)

AddressFamily:地址协议,有两种:
AF_INET:IPV4用于internet进程间通信
AF_INET6:IPV6用于internet进程间通信
是网络层协议

Type:套接字类型,有两种:
SOCK_STREAM:流式套接字,主要用于TCP协议
SOCK_DGRAM:数据报套接字,主要用于UDP协议
是传输层协议

有一些默认值在这里插入图片描述

socketObj1 = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
print(socketObj1.getsockname())
socketObj1.close()

socketObj2 = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

在linux系统中,socket可以看作是一个文件

4、UDP介绍

(1)什么是UDP
UDP ⽤户数据报协议,是⼀个⽆连接的简单的⾯向数据报传输层协议。UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但 是并不能保证它们能到达⽬的地。由于UDP在传输数据报前不⽤在客户和服务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快。
UDP是⼀种⾯向⽆连接的协议,基于数据报文传输的,每个数据报都是⼀个独⽴的信息,包括完整的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。

(2)UDP的特点
UDP是⾯向⽆连接的通讯协议,UDP数据包括⽬的端⼝号和源端⼝号信息, 由于通讯不需要连接,所以可以实现⼴播发送。
UDP传输数据时有⼤⼩限制,每个被传输的数据报必须限定在64KB之内。
UDP是⼀个不可靠的协 议,发送⽅所发送的数据报并不⼀定以相同的次序到达接收⽅。
优点:传输速度快
缺点:数据有可能丢失,不可靠

UDP结构:
在这里插入图片描述
源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
目的端口:目的端口号。这在终点交付报文时必须要使用到。
长度: UDP用户数据报的长度,其最小值是8(仅有首部),最多2^32-1 = 64KB。
校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃

(3)UDP应用场景
UDP是⾯向消息的协议,通信时不需要建⽴连接,数据的传输⾃然是不可靠的,UDP⼀般⽤于多点通信和实时的数据业务,⽐如:
语⾳⼴播 、
视频、QQ、
TFTP(简单⽂件传送)、
SNMP(简单⽹络管理协议) 、
DNS(域名解释)

5、UDP网络程序

在这里插入图片描述
在这里插入图片描述
服务端(UDP Server):提供服务
创建socket对象 ---- 绑定IP和端口 ---- 接收信息 ---- 发送消息(一个响应) ---- 关闭

客户端(UDP Client):访问提供的服务
创建socket对象 ---- 发送消息 ---- 接收消息 ---- 关闭

同一个目录下创建两个.py文件
服务端.py ; 客户端.py

"""服务端"""

import socket

# 1.实例化socket对象
udpServer = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)
# 2.绑定IP和端口,是一个元组
udpServer.bind(('0.0.0.0', 9001))  #0.0.0.0代表开放所有的IP地址
print('等待客户端UDP的连接。。。')
# 3.接收客户端的消息
recvdata, address = udpServer.recvfrom(1024)  # 会有两个返回值:发送的消息;哪个地址发来的(IP地址,端口地址)。是一个元组。最多1024个字节
print('接收到客户端的数据为:',recvdata.decode('utf-8'))   # socket传输的数据是一个bytes类型 :b'hello' ,将它转为字符串
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值