一、网络结构
1、网络结构分为两种如下:
C/S:client---基于网络通信------server
B/S:browser---基于网络通信----server
server端必须满足的条件如下:
1、1:保持server端能够稳定运行
1、2:server端必须有一个固定的ip地址
1、3:server端必须支持并发
2、什么是互联网?
互联网其本质就是由一系列协议(统一的标准)组成,其总称为‘互联网协议’。
互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。
互联网必须满足的两大要素:
1、有着良好的物理底层连接介质保持网络间的通信
2、必须有着一个统一的标准
补充:互联网协议可以相比着理解为其就像计算机界的英语
3、osi七层协议(我们只需掌握五层协议就行)
osi协议可以理解为是对互联网协议的划分,且osi协议可以划分为七层或五层或四层。
osi协议分层详情如下:
关于osi五层协议的详解:
物理层:指的是两台计算机通过某种连接介质连接到inter网
物理层的功能:通过高低电平来表示0/1,高电平代表1、低电平代表0
数据链路层:单纯的定义0和1没有任何意义所以必须通过数据链路层中的协议将0和1组合成一个有着意义的信息
数据链路层功能:定义了0和1的分组方式
数据链路层中包含的协议如下:
以太网协议Ethernet:
以太网协议:是一个被公认的统一的标准且以太网协议中数据是由一组0和1组成的数据包也叫帧,
每一个帧都包括报头head和数据data;每一个报头都有着固定的长度(18个字节)
报头包含有(源地址与目标地址)
Mac地址:
简述:Mac地址是由48位2进制数组成或者由12位16进制数组成,且每一个Mac地址在电脑硬件中代表的是网卡,
每一个网卡在出场的时候就已经以(前六位表示厂商编号,后六位便是流水线号)被烧制好了。
广播:
广播:有了Mac地址并处于统一连接的一台主机可以通过ARP协议获取另外一台计算机的Mac地址从而达到通信,且以广播的形式
进行通信即计算机通信基本靠吼。
网络层:是由一个个局域网组成的且局域网是以广播的形式进行通信的
网络层功能:(为了区分两台主机是否处于同一个局域网)引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址。
网络层的协议如下:
ip协议:
- 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
- 范围0.0.0.0-255.255.255.255
- 一个ip地址通常写成四段十进制数,例:172.16.10.1
子网掩码:所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,比如ip172.16.10.1其对应的二进制码是:10101100.00010000.00001010.000000001
了解:有了ip地址与子网掩码就可以判断两台计算机是否在同一个子网(局域网),如果两台计算机有着共同的子网掩码,就可以用子网掩码与ip的二进制码进行比较(都是1是为1,否则为0)的结果如果相同就表示它们在同一个子网。
ARP协议
arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网头,然后通过以太网协议发送。
ARP协议功能:以广播的方式发送数据包从而获取对方的Mac地址。
ARP功能具体实现如下:
传输层:
传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序所以可以通过ip+mac地址去找一个特定主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口
tcp协议:
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
udp协议:
不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
三次握手和四次挥手图示如下:
应用层:规定应用程序的数据格式且其协议可以自定义
4、socket 套接字
socket层图如下:
4.1 socket套接字的演变史
基于文件类型的套接字家族:AF_UNIX
基于网络通信类型的套接字家族:AF_IENT(我们常用的)
4.2基于tcp协议与udp协议通信的套接字
服务端tcp:
import socket ip_dic=('127.0.0.1',2206) base_lient=1024 server1=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server1.bind(ip_dic) while True: msg,adder=server1.recvfrom(base_lient) print(msg,adder) server1.sendto(msg,adder)
客户端tcp:
import socket ip_list=('127.0.0.1',2206) base_lient=1024 phone=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: mag=input('>>>:').strip() if not mag: continue phone.sendto(mag.encode('utf-8'),ip_list) mag,adder=phone.recvfrom(base_lient) print(mag.decode('utf-8'),adder)
服务端 udp:
from socket import * ip_port=('127.0.0.1',8080) ip_base=1024 server=socket(AF_INET,SOCK_DGRAM) server.bind(ip_port) while True: try: data,sock=server.recvfrom(ip_base) server.sendto(data,sock) except ConnectionResetError: break server.close()
客户端 udp:
from socket import * ip_port=('127.0.0.1',8080) ip_base=1024 client=socket(AF_INET,SOCK_DGRAM) while True: msg=input('>>>:').strip() if len(msg)==0: continue client.sendto(msg.encode('utf-8'),ip_port) data,sock=client.recvfrom(ip_base) print(data) client.close()