分层思想
每一个环节都是独立的,但是如果上层的环节没有完成就无法进行下一层的工作,在互联网中通信是需要标准的,而这所谓的标准就是协议,双方规定好的,举个例子:双方都使用英语来交流。这些协议很多,规定了每一个环节,但整个流程比较复杂,所以需要分层,变成功能相对单一的子过程
- 这样可以使整个流程更加清晰,发杂问题简单化
- 更容易发现问题并针对性解决问题
网络分层模型
OSI七层模型
同层使用相同协议,每层都填满了协议,下层为上层提供服务,其中两个重要的协议:TCP协议(传输层)、IP(网络层),后来表示层、会话层、应用层统称应用层,新的架构为了纪念这两个重要的协议,命名为TCP/IP五层协议栈
数据的封装和解封装
比如说qq软件(应用层)输入hello,传到传输层,然后
了解HTTP
HTTP(Hypertext Transfer Protocol),超文本传输协议,指的是在计算机世界中专门在两点之间传输超文本数据的规范。
超文本指的是现在计算机可以传输文字、图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,文本的语义被扩大化,因此被称为超文本。
传输指的是由传输载体负责把二进制数据包由计算机终端传输到另一个终端的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。请求方和应答方可以进行互换,请求方也可以作为应答方接受数据,应答方也可以作为请求方请求数据。
网络协议指的是网络中(包括互联网)传递、管理信息的一些规范。ftp、http、ftmp、pop、tcp/ip这些都是网络协议。
网络模型
为了给网络协议设计结构,设计者以分层的方式设计组织网络协议,每个协议属于层次模型之一,且每一层都向其上一层提供服务。每个分层中所有协议被称为协议栈,因特网协议栈分为五个部分:物理层、链路层、网络层、运输层和应用层。
应用层
应用层是网络应用程序和网络协议存放的分层。应用层协议分布在多个端系统上一个端系统应用程序与另外一个端系统应用程序交换信息分组,我们把位于应用层的信息分组称为报文(message)。常用的HTTP协议、FTP协议等等都在这一层中。
常见的应用层协议
1、DNS(域名系统)
DNS 是互联网使用的命名系统,用来把人们使用的机器名字(域名)转换为 IP 地址
2、FTP(文件传输协议)
FTP 是使用得最广泛的文件传送协议
3、Telnet(远程终端协议)
Telnet 是一个简单的远程终端协议,结合端口使用,常用于服务探测
4. HTTP(超文本传送协议)
HTTP 是面向事务的应用层协议,它是互联网能够可靠地交换文件的重要基础。http 使用面向连接的 TCP 作为运输层协议,保证了数据的可靠性。
5、SMTP(电子邮件协议)
SMTP 是简单邮件传送协议。SMTP规定了在两个相互通信的 SMTP 进程之间应如何交换信息。SMTP通信包括三个阶段,分别是:建立连接、邮件传送、连接释放。
6、POP3(邮件读取协议)
POP3,全称是 Post Office Protocol 3,该协议通常被用来接收电子邮件
7. SNMP(简单网络管理协议)
SNMP 协议由三部分组成,包括:SNMP本身、管理信息结构 SMI 和管理信息 MIB。SNMP 定义了管理站和代理之间所交换的分组格式。SMI 定义了命名对象类型的通用规则,以及把对象和对象的值进行编码。MIB 在被管理的实体中创建了命名对象,并规定类型。
8、TFTP(简单文件传送协议)
TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,它基于UDP协议而实现的,提供不复杂、开销不大的文件传输服务。默认端口号是 69。
除了上面介绍的协议外,其他应用层协议还有 DHCP、Gopher 、IMAP4、IRC、 NNTP、 XMPP、 SIP、 SSH、 RPC、 RTCP、 RTP、RTSP、SDP、 SOAP、 GTP、 STUN、 NTP、SSDP、 BGP 等
HTTP请求
当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据。直到浏览器解析该响应并显示出网页(或其他资源)为止。
HTTP请求
格式:
1 | <request-line> |
格式说明:
- 第一行必须是一个请求行(request-line),用来说明请求方法,要访问的资源(URL
的一部分)以及所使用的HTTP版本 - 请求头部信息,用来说明服务器要使用的附加信息,key:value
- 空行(一定要有)
- 请求主体信息
Get:
1 | GET / HTTP/1.1 |
说明:
- 第一部分说明了该请求是一个GET请求.该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录.该行的最后一部分说明使用的是HTTP1.1版本(另一个可选荐是1.0)
- 请求头部信息:
1
2
3- HOST将指出请求的目的地.
- User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送.
- Connection,通常将浏览器操作设置为Keep-Alive - 第三部分,空行,即使不存在请求主体,这个空行也是必需的
Post
1 | POST / HTTP1.1 |
说明:
- 请求行开始处的GET改为POST,以表示不同的请求方式
- Content-Type说明了请求主体的内容是如何编码的.浏览器始终以application/x-www-form-urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型
- Content-Length说明了请求主体的字节数
- 最后请求主体.名称-值对的形式
HTTP响应
格式:
1 | <status-line> |
说明:
- 状态行:协议版本 状态码 状态文字
- 消息报头 key:value
- 空行(一定要有)
- 响应主体信息
案例:
1 | HTTP/1.1 200 OK |
在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。最常用的状态码有:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
URL
http:\host[:port][abs_path][?query]#fragment
协议:告诉浏览器使用何种协议,常用的是http协议或https协议
主机(host):域名或ip,指示需要向网络上哪一台发起请求
端口(port):表示用于访问WEB服务器上资源的入口,如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。
路径(abs_path):web服务器上资源的路径,以端口后第一个/开始,到?结束
查询参数(query):提供给web服务器的额外参数,如果为GET请求一般URL带有查询参数
锚点(fragment):给予浏览器显示位于该点的内容的指示,其片段标识符不会与请求一起发送到服务器
请求头
- Host:表示对象所在主机,指明了服务器的域名,以及(可选的)服务器监听的TCP端口号。如果没有给定端口号,会自动使用被请求服务的默认端口
- Connection: 决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接。若为持久性连接(keep-alive)则事务完成后不关闭网络连接,反之为非持久性连接(close),一次事务完成后关闭网络连接。
- User-agent: 请求头用来告诉 Web 服务器,浏览器使用的类型
- Date:表示请求时的格林威治时间
- Content-Length:实体报头指示实体主体的大小,以字节为单位,发送到接收方。
- HTTP Referer 属性是请求标头的一部分,当浏览器向 web 服务器发送请求的时候,一般会Referer:告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
- Upgrade-Insecure-Requests:用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应。
- Accept:接受请求 HTTP 标头会通告客户端其能够理解的 MIME 类型。
文本文件: text/html、text/plain、text/css、application/xhtml+xml、application/xml
图片文件: image/jpeg、image/gif、image/png
视频文件: video/mpeg、video/quicktime
应用程序二进制文件: application/octet-stream、application/zip
状态码
2xx:成功响应
- 200 成功响应
- 204 请求处理成功,但是没有资源可以返回
- 206 对资源某一部分进行响应,由Content-Range 指定范围的实体内容。
3xx:需要进行附加操作以完成请求
- 301 永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI
- 302 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
- 303 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
- 304 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
- 307 临时重定向。该状态码与 302 Found 有着相同的含义。
4xx:客户端发生错误
- 400 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
- 401 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
- 403 该状态码表明对请求资源的访问被服务器拒绝了。
- 404 该状态码表明服务器上无法找到请求的资源。
5xx:服务器本身发生错误
- 500 该状态码表明服务器端在执行请求时发生了错误。
- 503 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
常用其他协议介绍
DNS
计算机网络中的每个端系统都有一个IP地址存在,而把IP地址转换为便于人类记忆的协议就是 DNS 协议。DNS 的全称是域名系统,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
HTTPS
HTTP 一般是明文传输,很容易被攻击者窃取重要信息,鉴于此,HTTPS 应运而生。HTTPS和HTTP有很大的不同在于HTTPS是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS在HTTP的基础上增加了SSL层,也就是说HTTPS = HTTP + SSL
。
TCP/IP
互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议
网络模型
为了给网络协议设计结构,设计者以分层的方式设计组织网络协议,每个协议属于层次模型之一,且每一层都向其上一层提供服务。每个分层中所有协议被称为协议栈,因特网协议栈分为五个部分:物理层、链路层、网络层、运输层和应用层。
运输层
运输层在应用程序断点之间传送应用程序报文。这一层中主要用到的是TCP协议与UDP协议,我们把运输层的分组称为报文段(segment)。
- TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。
- UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。
TCP三次握手
而要建立TCP/IP连接,就需要三次握手进行初始化
第一次握手:客户端发送一个TCP标志位SYN=1,ACK=0的数据包给服务端,并随机会产生一个Seq=J.当服务端接收到这个数据后,服务端由SYN=1可知客户端是想要建立连接;
第二次握手:服务端要对客户端的联机请求进行确认,向客户端发送应答号ACK=1、SYN=1、确认号Ack=J+1,此值是客户端的序列号加1,还会产生一个随机的序列号Seq=K,这样就告诉客户端可以进行连接;
第三次握手:客户端收到数据后检查Ack是否为J+1,以及标志位ACK的值是否为1,若为1,则会发送ACK=1、确认号码Ack=K+1,告诉服务端,你的请求连接被确认,连接可以建立,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
三次握手是在安全可靠的基础上,握手次数最少的方案。两次握手并不能保证可靠性,四次握手又浪费了效率。当然,有的需要更高安全性的地方,是可以有N次握手协议的,但那是特殊情况。
四次挥手
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,这时客户端也关闭连接。最终完成了四次握手。
SSL
普通的TCP通信无法保证数据的安全,它随时可能被第三方截获而泄漏通信双方之间的隐私,这显然是我们不希望看到的,尤其在跟用户名、密码、个人信息息息相关的通信过程(如网上银行交易、机密文件传输等等)尤其看重数据交互的隐秘性,所以我们常常用SSL协议来建立安全保密的通信,SSL协议能够保证交互双方的数据按密文方式传输,第三方在没有私钥的情况下几乎无法破解,从而到达保密的目的
SSL交互(握手)过程详解