网络编程1
研究网络编程其实就是在研究计算机的底层原理及发展史
一.楔子
你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好。但是如果这两个程序之间想要传递一个数据,你要怎么做呢?
这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。
但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢?
类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。
二.软件开发的架构
我们了解的涉及到两个程序之间通讯的应用大致可以分为两种:
第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用
第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用
这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构~
1.C/S架构
client(客户端)---------------------网络---------------------->server(服务端)
一般情况下客户端与服务端交互需要互联网 但是有些不需要(因为客户端和服务端都在一台计算机上)
c:client:客户端(用户),客户端可以有多个!!!
s:server:服务端(饭店中的工作人员),针对于一款软件来说,服务端就有一个
2.B/S架构
browser(浏览器)---------------------网络---------------------->server(服务器/端)
b:browser:浏览器 ------> 浏览器本身也是客户端(万能的客户端)
s:server:服务端(饭店中的工作人员)
本质上B/S架构也是C/S架构!!!
3.面试题
数据放在服务端和客户端的利与弊?
● 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了。
● 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少!
1.客户端到浏览器的演变
客户端中存在的问题:用户向使用软件就必须下载客户端使用,当用户下载的客户端足够多的时候,电脑就有可能会受到影响,在有就是客户要不断的下载,很不方便
浏览器的诞生:由于客户端存在的问题,随着互联网的兴起,就有人站出来开发出一款浏览器,其实,浏览器就是一个万能客户端, 或者叫超级客户端
2.服务端所具备的特征:
- 24小时不间断对外提供服务
- 服务端要有个公网IP,即固定的地址
- 能够服务多个客人(高并发)
'''
C/S架构
优势:不同公司的客户端由不同公司独立开发,可以高度定制化客户端功能
劣势:需要下载才能使用
B/S架构
优势:不用下载直接访问
劣势:无法高度定制化,并且需要遵守很多规则
'''
三.网络基础
基础知识
我们开发的软件都是基于网络传输的,我们现在搞清楚的是网络知识
- 什么是网络?
- 网络又称之为信息高速公路
- 上网的本质:上传和下载数据的过程!!!
- 最开始的时候,网络是一个个的局域网,世界上的其他电脑不能通信的,后来,把世界上其他电脑互通起来,这就是现在的互联网
- 网络的组成部分:物理链接设备(硬件)(网线,交换机,路由器等)+互联网通信协议(计算机的规则)
- 连接两台计算机之间的 Internet 实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列的协议,总称为“互联网协议”(Internet Protocol Suite)。
-
网络有什么好处
方便数据传输 -
什么是网络编程
基于网络编写代码,能够实现数据的远程交互
实现数据的远程交互必备的基础条件是物理连接介质 -
学习网络编程的目的
能够开发cs架构的软件
四.OSI七层协议
互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。区分出来的目的只是让你明白哪一层是干什么用的。
- 每一层都运行不同的协议。协议是干什么的,协议就是标准。
实际上还有人把它划成五层、四层。
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。(记忆:应、表、会、传、网、数、物)
五层划分为:应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层。
首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解
每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件
接收网络消息 数据由下往上传递
发送网络消息 数据由上往下传递
- 每层运行常见的物理设备
1.物理连接层
物理层功能:主要用于确保计算机之间的物理连接介质,接收数据(bytes类型、二进制数据)
基于电器特性负责发送高低电频,高电压对应数字1,低电压对应数字0 :(11)1010111010101010101
单纯的发送高低电频是没有意义的,需要进行分组,来表示不同的意思。分组是谁干的活呢?物理层干不了,这个是数据链路层干的。
2.数据链路层
数据链路层的功能:定义了电信号的分组方式
以太网协议ethernet
- 规定了计算机在出厂的时候都必须有一块网卡,网卡上有一串数字。该数字相当于是计算机的身份证号码是独一无二的
- 该数字的特征:12位16进制数据。前6位产商编号,后6位流水线号
- 该数字也称为:以太网地址/MAC地址
数据帧
ethernet规定:一组电信号构成一个数据报,叫做’帧’,每一数据帧分成:报头head和数据data两部分
● head包含:(固定18个字节)
○ 发送者/源地址,6个字节
○ 接收者/目标地址,6个字节
○ 数据类型,6个字节
● data包含:(最短46字节,最长1500字节)
● 数据报的具体内容:head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
Mac地址
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即Mac地址
Mac地址:每块网卡出厂时都被烧制上一个世界唯一的Mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
3.网络层
3.1 IP协议
规定了所有接入互联网的计算机都必须有一个IP地址,类似于身份证号
mac地址是'物理地址'可以看成永远无法修改
IP地址是动态分配的,不同的场所IP是不同的
- IP地址特征
- IPV4:点分十进制,0.0.0.0 --------->255.255.255.255
- IPV6:点分十六进制
- 如何查看自己电脑的IP地址
cmd---->ipconfig(Windows系统),ifconfig(Mac系统或者Linux系统) - 网络的划分:广域网,局域网
其实一个IP地址可以定位一个局域网,一个mac地址(物理地址)定位局域网中得一台计算机。ip+mac地址可以定位一个局域网中得唯一一台计算机。
其实,其实根本不需要mac地址,只需要一个IP地址就能确定,为什么呢?
是因为有一个arp协议,专门负责把IP地址解析成mac地址,也就说有了IP地址,就有了mac地址。
所以,一个IP可以定位到世界范围内独一无二的一台计算机
3.2 数据包(packet)
4.传输层
传输层的由来:网络层的IP帮我们区分子网,以太网层的Mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序。
那么我们通过IP和Mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:建立端口到端口的通信
一台电脑上的端口分配有:0-1024之间的端口默认是系统使用的,我们不要使用,如果使用,就有可能端口冲突。1024-8000之间的端口,一般是常用软件的端口。以后我们自己开发的软件,端口最后使用8000之后的。
ip+port:定位世界范围内独一无二的一台计算机正在运行的一个应用程序
4.1 常用的熟知端口号
应用程序 | FTP | TFTP | TELNET | SMTP | DNS | HTTP | SSH | MYSQL | Django |
---|---|---|---|---|---|---|---|---|---|
熟知端口 | 21,20 | 69 | 23 | 25 | 53 | 80 | 22 | 3306 | 8000 |
传输层协议 | TCP | UDP | TCP | TCP | UDP | TCP | TCP | TCP |
4.2 TCP协议
TCP与UDP都是用来规定数据交互方式的
TCP协议也称为是可靠协议。为什么说可靠呢?(数据不容易丢失):TCP协议数据传输的时候,建立双向管道,造成数据不容易丢失的原因不是因为有双向通道,而是因为有'反馈机制',给对方发消息之后会保留一个副本,直到对方回应消息收到了才会删除,否则会在一定的时间内反复发送。
基于以上,我们也称TCP协议为流式协议,像流水一样
TCP协议的三次握手与四次挥手
TCP协议的三次握手
● 最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
- TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
- TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
- TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
- TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
- 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
TCP协议的四次挥手
● 数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
面试题
1.洪水攻击
同一时间有大量的客户端请求建立链接,会导致服务端一致处于SYN_RCVD状态
很难避免,可以慢慢提升上限
降低洪水攻击带来的影响:在中间设置一个缓冲池(半连接池),当所有人来了后,先在缓冲池中排队。例如:只留10个人排队,剩下的全部驳回,这10个人一个一个建链接
'''面试题(并发中也有方法解决)'''
2.服务端如何区分客户端建立链接的请求
可以对请求做唯一标识(seq=x,用不一样的英文字母来区分)
3.四次不能合并为三次
因为中间需要确认消息是否发完(TIME_WAIT状态->等待状态)
4.3 UDP协议
也称之为数据报协议、不可靠协议
不会建立双向链接。如果使用UDP协议,客户端只负责发送数据,至于对方收到没收到,不关心
4.4 数据段(segment)
5.应用层
应用层相当于是程序员自己写的应用程序 里面的协议非常的多
- 如果是客户端程序,协议想用什么就用什么,因为客户端是我们自己写的
- 如果是浏览器,协议就不能随意用了,就要按照浏览器规定的协议,因为浏览器不是我们自己写的,
http协议
浏览器使用的协议:http协议,默认端口号:80
-
http://www.baidu.com:80/v2/api/?login
解析:
- https: -- 协议
- // ----- 分隔符
- www.baidu.com: -- 域名
- 80 --- 端口,此时的80可省略
- v2/api --- 路径
- ?login --- ?参数,放在?后面的都是参数
https: http + ssl证书
http和https的区别
- https更加安全,密文传输数据
- http不安全,明文传输数据
- https协议监听的默认端口是:443