网络编程 -- 基础概念

网络编程

基于同一台机器上的多个程序之间通信,可以基于文件

基于多台机器上的多个程序之间通信,可以基于网络

我们平时使用的网络(web程序)是由两种架构完成的

C/S 架构:client 客户端  server 服务端

B/S 架构:browser 浏览器  server 服务端

C/S架构特点

所有的都需要安装一下 

windows系统中为 .exe 文件 是一个客户端

例如 QQ 百度网盘 爱奇艺

一个S端对应多个C端

安装一个客户端,然后这个客户端就可以和服务端进行网络交互

B/S架构特点

所有能用网页访问的网站,这个网站就是B/S架构的

例如 京东 4399  这种能用到浏览器直接访问的

如果一个网站可以被网页访问,这个网站就是B/S架构

B/S架构和C/S架构的关系

所有的B/S架构都需要一个浏览器才能访问

浏览器是一个软件,相当于一个客户端

所有的B/S架构也都是C/S架构的

浏览器(browser)也是特殊的客户端(client)

这两种架构哪一种好

C/S架构 装好之后直接双击就可以使用了   更灵活 可以右键点击

B/S架构 极大的简化了我们使用软件的成本   更符合现在的使用理念,但还有很多功能没有实现

B/S架构 在PC端统一了程序的入口  在手机端没那么适合使用浏览器,更喜欢统一入口的软件

网卡

是独一无二不重复的

mac地址

网卡上有一个内容 就是mac地址

唯一的标识了一台机器

mac地址 传输的内容 接收人的mac地址

是十二位的十六进制数

多台机器之间的通信

交换机给所有的机器都发送一条信息(带着这台机器的ip地址)

如果机器的ip和交换机发送信息的ip不同,就丢弃这条信息

ip和发送的信息相同,返回自己的mac地址

交换机不认识ip地址

假设 ip地址位 192.168.16.3

先把ip地址转为二进制

交换机先读32位 找到是谁发给我的ip

      又读32位,找到了是发给我的

地址解析协议(arp协议)

由交换机完成的

通过ip地址找到一台机器的mac地址

使用到了交换机的广播(指向所有机器)和单播(指向一个机器)的功能(还有一个组播功能,但arp协议里没有用到)

ipv4协议 32位的二进制组成4位点分十进制

0.0.0.0 -- 255.255.255.255

ipv6协议 由6位冒分16进制组成的

0:0:0:0:0:0 -- FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF

所有的机器连在一个交换机上 交换机通过广播找一台机器 很麻烦

可以分区域

路由器

是用来连接交换机的

路由器的接口叫网关 有的网站会封ip地址,其实封的是网关

局域网

连在同一个交换机上的机器叫做局域网内的机器 

局域网之间的通信由路由器完成

路由器提供给局域网一个统一的网关ip 通过网关ip访问其他网络

如果局域网太多,一个路由器连接不下,路由器还可以连接路由器

有ip为什么还要mac

mac地址是这台机器的唯一标识

端口

ip地址+mac地址确定机器

端口确定这台机器上的具体应用

端口共有65535个  0-65535

常用8000之后的端口

子网掩码

把ip地址和子网掩码分别转成二进制

然后 分别按位置对比

1&1 = 1   1&0 ,0&0 ,0&1 = 0

最后转回二进制,如果相同,两个ip地址就是同一网段

ip的保留字段

ipv4的地址是有限的

0.0.0.0 - 255.255.255.255

想用哪个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

这些字段是有可能在各个公司的内网被重复使用的,而不会对外真正提供服务的

127.0.0.1 本地的回环地址 

总是找当前自己的机器,不通过交换机

别的人找不到你 只有自己这台机器能找到你自己

0.0.0.0  全网段地址

打到这台机器上的服务,都认为是可以接收进来的

socket模块

套接字

所有的网络通信的底层都是基于socket做的

通信分为server文件和client文件

server文件

import socket
sk = socket.socket()#创建一个socket对象
sk.bind(('127.0.0.1',9123))#绑定一个服务端的地址,bind里面的是元组,元组里最后一项需要满足是int类型,8000之后,65535之前
sk.listen()#开始接受客户端给我的连接
conn,addr = sk.accept()#阻塞,直到有人连我,conn代表我和他之间的连接,addr代表他的IP地址
conn.send(b'hello')#给他发消息,必须是bytes类型
msg = conn.recv(1024)#从他处接受信息,里面写1024代表接受1024字节个消息,不足1024个全部接收,超过只接收1024个字节
print(msg.decode('utf-8'))#打印消息
conn.close()#'挂电话'
sk.close()#'关机'

client文件

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9123))
msg = sk.recv(1024)#server是先发再收,所以client是先收再发
print(msg)
sk.send(b'wahaha')
sk.close()
原文地址:https://www.cnblogs.com/biulo/p/10673569.html