目录
一、网络编程引入
我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。由于在不同机器上的程序需要通信,才产生了网络。
通过网络让不同计算机上运行的程序进行通信
例如:两个人通过两台电脑上的QQ进行聊天
二、软件开发架构
(一)客户端服务端概念
客户端:就是我们常用的程序。例如qq、微信,浏览器等等。
服务端:要一直运行着给别人提供服务的机器(电脑、服务器)。
(二)C/S架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构。
这里的客户端一般泛指客户端应用程序exe,程序需要先安装后,
才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。
C/S架构 应用程序 长连接 断网程序即止
两个熟悉的人一直聊
(三)B/S架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构。
只需在浏览器上通过HTTP去请求服务器端相关的资源(网页资源)。
B/S架构 web程序 短连接 断网网页仍存在,一次请求一次问答结束后即断开,断网不会有影响
两个陌生的人尬聊
三、计算机网络
(一)概念
一开始只有MAC地址,但是MAC地址找起来非常麻烦,因此根据ARP协议将MAC地址转换为便于找到且具有唯一性的IP地址。
IP地址范围:0.0.0.0-255.255.255.255。
一个ip地址通常写成四段十进制数,例:172.16.10.1
一个特殊的地址 127.0.0.1 本地回环地址,访问自己电脑上的程序。
(二)查看IP地址的方法
方法一
cmd---->ipconfig/all
方法二
(三)端口
我们通过了ip地址找到了具体的某一台电脑,那我们怎么找到了想访问的应用呢?
例如两台QQ进行聊天案例,怎样找到另外一台电脑上的QQ程序呢?就需要通过电脑上的端口了。
命令:cmd---->>>netstat -an
注意:
(1)电脑上的每一个应用程序想运行必须占一个端口号。并且端口号同时间只能被一个应用程序占用。
(2)每一台电脑上一共有65536个端口,端口的范围是0~65535。
(3)一般0~1023被一些其他应用已经占用,因此我们一般从1024开始指定端口。
(四)网络协议(TCP/IP协议簇)
网络协议就是为了能让计算机网络中进行数据交换而建立的规则、标准;
例如下载软件然后如果不同意协议就不能继续下一步,同样的道理在互联网中,如果不遵循互联网协议就不能访问到资源。
应用层
向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。
FTP(File Transfer Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。
Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。
DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换,使用端口53。
SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中转,使用端口25。
NFS(Network File System)是网络文件系统,用于网络中不同主机间的文件共享。
HTTP(Hypertext Transfer Protocol)是超文本传输协议,用于实现互联网中的WWW服务,使用端口80
传输层
提供应用程序间的通信。
传输控制协议TCP(Transmission Control Protocol),面向连接的可靠的协议。
三次握手
第一次握手:客户端让服务器准备好资源
第二次握手:服务端资源资源准备好了并且服务端问客户端资源有没有准备好
第三次握手:客户端资源也准备好了,接下来才真正的发送数据
三次握手的时候发送的是值
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
数据传输:每传递一次消息,服务端都会告诉客户端说收到消息了。这样确保数据不会丢失。因此我们说TCP是可靠地面向连接(连接一直连着)的传输协议
四次挥手
客户端给服务器说再见,服务器给客户端说拜拜,服务端告诉客户端我也不和你玩了,客户端说不玩就不玩。
第一次,客户端告诉服务端我不会给你发数据了,第二次服务端告诉客户端我收到你发生的信息了,第三次服务端给客户端发生数据说我也不给你发了,第四次客户端给服务端说我知道了。
用户数据报协议UDP(User Datagram protocol),面向无连接的不可靠的协议。
面向无连接,数据不安全,速度快,不可靠,数据有可能丢失。不区分客户端与服务端。
用于网络电话,在线视频网络会议等等,要求实时性比较高(数据传输快)不能有延迟。
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
因此UDP是不可靠无连接的协议。因为有可能数据会丢失。
网络层
负责相邻计算机之间的通信。
IP(Internet Protocol)协议,IP是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务。
ICMP(Internet Control Message Protocol)控制报文协议,ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。
Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试
数据链路层
数据链路层是负责接收IP数据包并通过网络发送,或者从网络上接收物理帧,抽出IP数据包,交给IP层。
ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。
RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站还有DHCP服务
例如 应用层指的是QQ通信需要有自己的协议,迅雷下载下载东西有自己的协议,浏览器访问互联网 使用的是HTTP协议。
例如现在发送一个‘hello’走的过程是:
在应用层加上自己的协议 例如 xx hello。
传递到了传输层,添加了源端口和目的端口。
走到了网络层,会在前面添加上 源ip地址和目的ip。
走到链路层,添加源mac 地址和目的mac地址。
然后通过网线传输到对方的电脑上,先判断是不是我的mac地址,
如果是就减去mac,在往上到网络层,判断是不是我的ip地址,
如果是就减去,依次往上走,直到qq。中间如果有一层不对就把数据扔掉。
对方就不能获取发送过来的信息。
(五)OSI模型
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
物理层:提供为建立、维护和拆除物理链路所需要的机械的、电气的、功能的和规程的特性;有关的物理链路上传输非结构的位 流以及故障检测指示。
数据链路层:在网络层实体间提供数据发送和接收的功能和过程;提供数据链路的流控。
网络层:控制分组传送系统的操作、路由选择、用户控制、网络互连等功能,它的作用是将具体的物理传送对高层透明。
传输层:提供建立、维护和拆除传送连接的功能;选择网络层提供最合适的服务;在系统之间提供可靠的透明的数据传送,提供 端到端的错误恢复和流量控制。
会话层:提供两进程之间建立、维护和结束会话连接的功能;提供交互会话的管理功能,如三种数据流方向的控制,即一路交 互、两路交替和两路同时会话模式 。
表示层:代表应用进程协商数据表示;完成数据转换、格式化和文本压缩。
应用层:提供OSI用户服务,例如事务处理程序、文件传送协议和网络管理等。
四、Socket
(一)概念
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,让Socket去组织数据,以符合指定的协议。
(二)分类
套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
基于文件
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
基于网络
套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
(三)socket参数详解
(四)基于TCP协议的Socket使用
Socket是基于tcp协议的,tcp是基于链接的,因此在通讯开始之前,一定要先建立相关的链接,才能发送数据。必须先启动服务端,然后再启动客户端去链接服务端。
应用:聊天
服务器端的代码
import socket
server_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port=('127.0.0.1',8888)
server_sk.bind(ip_port)
server_sk.listen(128)
new_socket,addr=server_sk.accept()
while True:
content=new_socket.recv(1024).decode('utf-8')
print('我是服务端,客户端发来喜电---->',content)
if content=='拜拜了您嘞':
break
msg=input('S---->>>').encode('utf-8')
new_socket.send(msg)
if msg=='拜拜了您嘞':
break
new_socket.close()
server_sk.close()
客户端代码
import socket
client_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port=('127.0.0.1',8888)
client_sk.connect(ip_port)
while True:
msg=input('C---->>>')
client_sk.send(msg.encode('utf-8'))
if msg=='拜拜了您嘞':
break
ret=client_sk.recv(1024).decode('utf-8')
print('我是客户端,服务端发来贺电--->',ret)
if ret=='拜拜了您嘞':
break
client_sk.close()
结果
(五)基于UDP协议的Socket使用
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接
应用:聊天
服务器端的代码
import socket
sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8888))
while True:
content,addr=sk.recvfrom(1024)
print('您有新消息:',content.decode('utf-8'))
if content.decode('utf-8')=='bye':
break
msg=input('请输入内容:')
sk.sendto(msg.encode('utf-8'),addr)
if msg=='bye':
break
sk.close()
客户端代码
import socket
#1.创建socket
client_sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2.发送内容
while True:
msg=input('请输入内容:')
client_sk.sendto(msg.encode('utf-8'),('127.0.0.1',8888))
if msg=='bye':
break
content,addr=client_sk.recvfrom(1024)
print('您有新消息:',content.decode('utf-8'))
if content.decode('utf-8')=='bye':
break
#3.关闭
client_sk.close()
结果