网络基础
知识内容:
1.C/S架构与B/S架构
2.IP地址、端口、域名与URL
3.网络分层
4.TCP/UDP协议
5.HTTP协议
6.socket
一、C/S架构与B/S架构
1.C/S架构:client-server架构
C/S即client/server架构,是当前大多数网络编程所采用的架构模型。通过它可以充分利用两端硬件环境的优势,将任务合理分配到client端和server端来实现,降低了系统的通信开销。client/server架构一般有一台后台计算机作为服务器,用户的个人机上的软件程序作为客户端
server:服务端 client:客户端
典型应用:QQ、LOL
2.B/S架构:browser-server架构
B/S即browser/server架构,是web兴起后流行起来的一种网络架构模式,B/S架构使用浏览器当作客户点的应用软件,所以B/S架构可以看作C/S的一种特殊情况,是对C/S架构模式的一种改进
serve:服务端 browser:浏览器
典型应用:所有的网站
3.B/S架构的优点
a.便于部署、维护和升级: B/S的应用程序都部署在后台服务器上,一般无需更新客户端软件(即浏览器)
b.跨平台、对客户机要求低: 客户端的计算机硬件环境千差万别,传统C/S架构需要对不同操作系统开发不同的客户端软件,而每种操作系统都支持web浏览器,基于web开发的B/S架构系统只需开发一套客户端程序并且客户端程序是部署在web服务器上,由浏览器在访问时下载到客户端运行 (注: 这里的客户端程序一般指前端代码 eg: HTML\CSS\JavaScript等)
c.对安全性要求极高: B/S架构系统一般建立在广域网上,也就是有很多人能访问,面向的是未知用户,所以开发B/S系统时更要注意系统的防攻击、数据加密、备份、非伪造等能力
4.B/S架构与C/S架构的关系
B/S架构其实C/S架构的一种,不过client变成了browser,browser其实也是一种客户端
二、IP地址、端口、域名与URL
1.IP地址
(1)IP定义
IP是一个网络层中的概念,是物联网上的主机在网络中具有的逻辑地址,计算机网络中采用IP地址表示网络地址。现在的IP地址可以分为IPv4和IPv6两种
(2)IPv4和IPv6
IPv4: 一个32位二进制数的地址,一般表示为4个十进制数字,比如: 172.16.32.3、10.38.96.243等
一个IPv4地址被划分为两部分: 网络地址和主机地址。根据网络地址和主机地址的不同位数规定,可以将IP地址划分为3类:
A(8位网络地址和24位主机地址) B(16位网络地址和16位主机地址) C(24位网络地址和8位主机地址),由于某些原因,A类和B类地址几乎分配殆尽
IPv6: 由于IPv4的数量限制,就推出了IPv6,IPv6由1128位二进制数表示,在表达方式上使用8个16进制数字表示,比如: d23:4334:0:0:23:ade:9853:23
IPv4与IPv6比较: 单从数量级上来说,IPv6所拥有的地址容量大概是IPv4的8*10^28倍,达到2^128个。IPv6不但解决了网络地址资源数量的问题,也为除了计算机外的设备分配IP地址来连入互联网提供了方便。当然目前广泛使用的还是IPv4,但是毫无疑问IPv6将是未来IP地址的主流。
(3)IP\MAC\ARP之间的关系
为什么需要IP地址:为了方便找到其他主机,可以通过ARP协议将IP地址转化成MAC地址, MAC地址是一个主机的唯一标识(全球唯一)
关于ARP协议:https://baike.baidu.com/item/ARP/609343?fr=aladdin&fromid=1742212&fromtitle=ARP%E5%8D%8F%E8%AE%AE
获取本机的IP地址和MAC地址:
1 # __author__ = "wyb" 2 # date: 2018/5/11 3 # 获取本机的IP地址和MAC地址 4 5 import socket 6 import uuid 7 8 ip = socket.gethostbyname(socket.gethostname()) 9 node = uuid.getnode() 10 macHex = uuid.UUID(int=node).hex[-12:] 11 mac = [] 12 for i in range(len(macHex))[::2]: 13 mac.append(macHex[i:i+2]) 14 mac = ':'.join(mac) 15 print('IP:', ip) 16 print('MAC:', mac)
(4)保留IP地址
保留IP地址:保留IP地址不会在互联网中使用,其主要被用在企业机构内部作为局域网地址使用
保留地址主要在以下四类:
- A类:10.0.0.0-10.255.255.255(长度相当于1个A类IP地址)
- A类:100.64.0.0-100.127.255.255
- B类:172.16.0.0-172.31.255.255(长度相当于16个连续的B类IP地址)
- C类:192.168.0.0-192.168.255.255(长度相当于256个连续的C类IP地址)
这些地址是不会被互联网分配的,也不会被路由通过
127.0.0.1 -> 回环地址
2.端口
在web中,端口是一个软件级的概念,是虚拟端口,IP地址是网络层的寻址方式,而端口就是传输层的寻址方式。端口是一个16位二进制数表达的正整数,数字范围为0到65535
注:在同一时间内只能有只会有一个程序占用一个端口,不可能同时有两个程序占用同一个端口,一般情况下我们自己使用8000之后的端口
常用的默认端口号:
IP地址与端口:
- IP-->确定一台主机
- 端口-->确定唯一的程序
- IP+端口-->确定唯一的一台机器上的唯一的一个程序
3.域名
IP地址由纯数字组成,让人难以记住,且不能表达功能、地理位置等信息,所以标准化组织就定义了域名这种主机地址表示方式
域名: 域名是应用层概念,是由一串用点分割的名字组成的网络上某台计算机或计算机组的名称,域名可以说是IP地址的一个面具
常见的域名: www.baidu.com www.sina.com.cn等
注: 域名中的符号都由英文字母和数字组成,每个标点不超过63个字符,也不区分大小写字母,标号中除了连字符(-)以外不能使用任何其他标点符号
4.URL
URL: 全球统一资源定位符 其实就是一个链接,链接背后是资源,资源可以是一张图片、一首歌、一张网页、、、
URL的标准形式: [协议]://[主机]:[端口]/[路径]?[参数] 注: 一般协议有: http、https、ftp等 端口一般都省略了
eg: https://www.nowcoder.com/1476481
http://www.cnblogs.com/wyb666/p/8494861.html
URL组成(四部分)
- 协议 http, https(https 是加密的 http)
- 主机 g.cn zhihu.com之类的网址
- 端口 HTTP 协议默认是 80,因此一般不用填写
- 路径 下面的「/」和「/question/31838184」都是路径
http://www.zhihu.com/question/31838184
三、网络分层
TCP/IP四层 TCP/TP五层 OSI七层模型
每层的物理设备如下
每层的常见协议如下
OSI模型各层对应的协议:
- 应用层 -> DNS(域名解析) FTP(文件传输) HTTP(超文本传输协议,用于网页中) SMTP(简单邮件传输协议) TELNET(远程登录协议)
- 传输层 -> TCP UDP
- 网络层 -> IP协议
- 数据链路层 -> ARP协议
四、TCP/UDP协议
1.TCP
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP的特性: 有序性、真确性、可靠性、可控性,TCP使用面向连接的方式收发数据,在收发数据之前需建立连接,在数据传输之后释放连接,建立连接时采用3次握手的方式来保证发送的可靠性、可控性
在双方成功握手之后将在两个应用程序之间建立一个全双工的通信,这个全双工通信将占用两个计算机之间的通信线路,直到它被一方关闭或双方关闭为止
全双工:双方可以收发消息,接受消息
应用:web浏览器、电子邮件、文件传输
为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭连接,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手
2.UDP
UDP是一种无连接的传输层协议,提供面向对象的简单的不可靠信息传送服务,虽然UDP不可靠,但是由于UDP的开销小一般UDP适用于吞吐量大(轻量级控制)、可以承受信息丢失(传输不可靠)的应用场景。而且在网络状况良好的情况下,UDP的丢包率在实际情况下也非常少,所以有很多经典的协议采用UDP进行传输,比如SNMP、NFS、DNS等
应用:域名系统(DNS)、视频流
3.TCP与UDP
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
4.TCP、UDP与socket
五、HTTP协议
1.HTTP介绍
HTTP即超文本传输协议,是web中的最主要的web应用层标准,B/S架构的应用系统用HTTP在客户端于服务器之间进行传输数据。HTTP可以传输任何格式的数据,比如说文本、图片甚至视频都可以通过HTTP进行传输
浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器 -> 服务器解析请求,按照规定的格式返回文本数据到浏览器 -> 浏览器解析得到的数据,并做相应处理
2.HTTP流程
- 客户端连接到Web服务器: HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com
- 发送HTTP请求: 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
- 服务器接受请求并返回HTTP响应: Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成
- 释放连接TCP连接: 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求
- 客户端浏览器解析HTML内容: 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器
- 释放 TCP连接
- 浏览器将该 html 文本并显示内容
HTTP端口号默认为80,当服务器发现有客户端建立连接并提交了一个HTTP请求后,就根据请求的内容执行相应的操作,并将结果返回给客户端
3.HTTP特点
1 HTTP协议属于应用层,并工作于客户端-服务端架构上
2
3 HTTP协议是用于从服务器传输超文本到本地浏览器的传送协议
4
5 HTTP是一个基于TCP/IP通信协议来传递数据的协议
6
7 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应
8
9 简单快速:客户向服务器请求服务时,只需传送请求方法和路径;由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快
10
11 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
12
13 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
14
15 无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
HTTP协议流程如下图:
4.HTTP请求格式和响应格式
(1)HTTP请求格式
请求首行; // 请求方式 请求路径 协议和版本,例如:GET /index.html HTTP/1.1 请求头信息; // 请求头名称:请求头内容,即为key:value格式,例如:Host:localhost 空行; // 用来与请求体分隔开 请求体。 // GET没有请求体,只有POST有请求体。
浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!在HTTP协议中,请求有很多请求方法,其中最为常用的就是GET和POST
HTTP默认的请求方法就是GET
注意:
- 没有请求体
- 数据量有限制!
- GET请求数据会暴露在浏览器的地址栏中
GET请求常用的操作:
1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
2. 点击页面上的超链接也一定是GET请求
3. 提交表单时,表单默认使用GET请求,但可以设置为POST
(2)HTTP响应格式
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
- 第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
- 第二部分:消息报头,用来说明客户端要使用的一些附加信息
- 第三部分:空行,消息报头后面的空行是必须的
- 第四部分:响应正文,服务器返回给客户端的文本信息。
关于响应状态码:
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别: 1xx:指示信息--表示请求已接收,继续处理 2xx:成功--表示请求已被成功接收、理解、接受 3xx:重定向--要完成请求必须进行更进一步的操作 4xx:客户端错误--请求有语法错误或请求无法实现 5xx:服务器端错误--服务器未能实现合法的请求 常见状态码: 200 OK //客户端请求成功 400 Bad Request //客户端请求有语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found //请求资源不存在,eg:输入了错误的URL 500 Internal Server Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
5.GET和POST请求的区别
GET请求 GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive 注意最后一行是空行 POST请求 POST / HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley
GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中)
POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。
而在实际开发中存在的限制主要有:
- GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。因此对于GET提交时,传输数据就会受到URL长度的 限制
- POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置
GET和POST的区别:
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,POST方法是把提交的数据放在HTTP包的Body中
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值
- GET方式提交数据,会带来安全问题,比如登录页面时通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码
六、socket
1.socket概念
socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机
建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据
2.socket连接过程
服务器监听->服务器socket并不定位具体的客户端socket,而是处于等待链接的状态,实时监控网络状态
客户端请求->客户端socket发出连接请求,要连接的目标是服务端socket,为此,客户端socket必须先描述它要连接的服务端socket,指出服务端socket的地址和端口号,然后想服务端socket提出连接请求
连接确认->当服务端socket监听到或者说是接收到客户端socket的连接请求,它就响应客户端socket的请求,建立一个新的线程,把服务端socket的描述发给客户端,一旦客户端确认了,连接就好了。服务端socket基础处于监听状态
3.socket两种模式
socket有两种操作方式:面向连接和无连接的
- 面向连接的socket操作就像一部电话,必须建立一个连接和一个呼叫,所有事情在到达是的顺序和它们出发的顺序一样
- 无连接的socket就想一个邮件投递,没有什么保证,顺序很可能会不同
具体使用什么模式得看场景,如果可靠性更重要的话,用面向连接的好一些,另外面向连接的操作使用tcp协议,效率会低一些,但是安全性高
无连接的操作使用数据报协议(udp),这种模式下的socket不需要连接目的socket,只是简单的透出数据报,无连接的操作是高效的,但是不安全。
4.socket层
5.理解socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议
其实socket就是一个模块,我们通过调用模块中的方法来建立两个进程之间的通信