目录
一、通信协议介绍
计算机网络体系结构:
TCP/IP协议族:
二、TCP/IP协议族
IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网络协议群。
2.1 应用层协议
应用层协议定义了运行在不同系统上的应用程序进程如何相互传递报文;
2.1.1 FTP协议
文件传输协议(
)。是用于在网络上进行文件拆念书的一套标准协议,它工作在OSI模型的第七层,TCP模型的第四层。FTP允许用户以文件操作的方式(如文件的增删改查、传送等)与另一主机相互通信;熟知端口号为:21、20
用途:在计算机之间传送文件(尤其是批量传输文件);也可以用于让网站设计者将构成网站内容的大量文件批量上传到他们的web服务器;
工作过程:
- 主动模式:
①FTP客户通过临时端口号向FTP服务器发起TCP连接(21号端口),这个TCP连接是用来传送相应的控制命令与告知自己另一个临时端口的,在整个会话期间一直保持打开;
②FTP服务器通过20号端口向FTP客户的另一个临时端口建立TCP连接,这个连接是用于实现数据传输的,每次传输完毕后断开连接;
③传输完毕后双方四次挥手断开控制命令的TCP连接,会话结束;
- 被动模式:
举例:
2.1.2 HTTP协议
超文本传输协议(
)是一个简单的请求-相应协议。运行在TCP之上(面向连接、可靠的),它指定了客户端可能发送个服务器什么样的消息以及得到什么样的相应;
1)超文本
超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。
2)协议特点
- C/S模式:需要使用浏览器作为客户端来访问服务器;
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于请求报文规模较小,使得通信速度很快;
- 灵活:HTTP允许传输任意数据类型,由ContentType(HTTP包中用来表示内容类型的标记)加以标记;
- 无连接:每请求一次就释放一次链接,每次连接只能处理一个请求。这样的优点是节省传输时间且实现简单。有时也称为短连接。
- 有连接:也称为长连接,专门针对短连接解决效率问题。建立好了一个连接之后,可以多次请求。但是缺点在于容易造成占用资源不释放的问题。HTTP协议头部中的字段
Connection:keep-alive
表示支持长连接; - 单向性:服务端永远是被动地等待客户端的请求;
- 无状态:无状态是指协议对于事务处理没有记忆功能。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,若服务器不需要先前信息时应答就比较快。
-
- 为了解决HTTP的协议的无状态问题,两种用于保持HTTP连接状态的技术应运而生:Cookie、Session;
3)发展和版本
- HTTP/1.0:浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态),请求只能由客户端发起(单向性);
- HTTP/1.1:HTTP/1.0中默认使用
Connection: close
。在HTTP/1.1中已经默认使用Connection: keep-alive
(长连接),避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容;
-
- 通过
Content-Length
字段来判断当前请求的数据是否已经全部接收。 - 不允许同时存在两个并行的响应;
- 通过
- HTTP/2.0:
-
- 长连接:在HTTP/2.0中,客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源。 单一的连接应该是HTTP/2.0的主要优势,单一的连接能减少TCP握手带来的时延 。HTTP/2.0中用一条单一的长连接,避免了创建多个TCP连接带来的网络开销,提高了吞吐量;
- 多路复用,连接共享:HTTP2.0中所有加强性能的核心是二进制传输,在HTTP1.x中,我们是通过文本的方式传输数据。在HTTP/2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。不同的 request 可以使用同一个连接传输(最后根据每个request上的id号组合成正常的请求);
帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。 所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。
-
- 首部压缩:由于HTTP/1.1中header带有大量的信息,并且得重复传输,HTTP/2.0使用encoder来减少需要传输的hearder大小;
- 服务端推送:在HTTP/2.0中,服务端可以在客户端某个请求后,主动推送其他相关联资源。 可以想象一下,某些资源客户端是一定会请求的,这时就可以采取服务端push的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间。在浏览器兼容的情况下也可以使用prefetch。
- 更安全:HTTP2.0使用了tls的拓展ALPN做为协议升级,除此之外,HTTP/2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法。
- HTTP/1.1和HTTP/2.0区别:
协议 | 传输格式 | 多路复用 | 首部压缩 | 服务器推送 | 请求优先级 | 支持长连接 |
http1.1 | 文本 | × | × | × | × | √ |
http2.0 | 二进制帧 | √ | √ | √ | √ | √ |
4)URI、URL、URN
- URI: 统一资源标识符,是一个用于标识互联网某个唯一资源的字符串名称;
URI是个纯粹的语法结构,用于指定标识Web资源的字符串的各个不同部分。他不属于定位符,因为根据该标识符无法定位任何资源。
- URL: 统一资源定位符,可以帮助我们定位互联网上的某一个唯一资源,相当于是互联网资源的身份证号。
URL的五个元素包括在一个简单的地址中:
- 传送协议;
- 服务器(通常为域名或者IP地址);
- 端口号(以数字方式表示,若为HTTP的默认值“:80”可省略);
- 请求资源路径;
- 传递数据。(在URL中传递数据是以key=value的结构进行数据绑定,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题);
例如:
http://www.itbaizhan.cn:80/course/id/18.html?a=3&b=4
其中:
http
是协议;www.itbaizhan.cn
,是服务器域名;80
,是服务器上的默认网络端口号,默认不显示;/course/id/18.html
,是路径(URI:直接定位到对应的资源);?a=3&b=4
,请求时传递的数据;
- URN: 统一资源名称,其目的是通过提供一种途径,用于在特定的命名空间资源的标识,以补充网址。
URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式。
4)HTTP协议的请求报文
HTTP请求过程分析:
打开一个网页需要浏览器发送很多次Request:
- 当你在浏览器输入URL http://www.itbaizhan.cn 的时候,浏览器发送一个Request去获取 http://www.itbaizhan.cn 的html。服务器把Response发送回给浏览器。
- 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如图片,CSS文件,JS文件。
- 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
- 等所有的文件都下载成功后。 网页就被显示出来了。
请求状态分析:
Request 消息分为3部分:
- 第一部分叫Request line — 请求行;
- 第二部分叫Request header — 请求头 ;
- 第三部分是Request body — 请求体;
Request header和Request body之间有个空行;
请求行:
- GET /course/id/18.html?a=3&b=4 HTTP/1.1
- POST /login HTTP/1.1;
请求头:
请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应。请求头中信息的格式为key:value。
- Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。
- Connection:连接方式。如果值是close则表示基于短连接方式,如果该值是keep-alive,网络连接就是持久的,在一定时间范围内是不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
- Upgrade-Insecure-Requests:服务端是否支持https加密协议。
- Cache-Control:指定请求和响应遵循的缓存机制。
- User-Agent:浏览器表明自己的身份(是哪种浏览器)。例如Chrome浏览器:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36。
- Accept:告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型。
- Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。
- Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等。
- Accept-Charset:浏览器告诉服务器自己能接收的字符集。
- Referer:表示浏览器应该在多少时间之后刷新文档,以秒计时。
- Cookie:可向服务端传递数据一种模型。
请求体:
客户端传递给服务器的数据。比如:表单使用post
方式提交的数据、上传的文件数据等;
请求方式:
- GET:向指定的资源发出“显示”请求。GET请求中会将请求中传递的数据包含在URL中并在浏览器的地址栏中显示。GET请求传递数据时要求数据必须是字符。GET请求可以被浏览器缓存。
- POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求传递数据时,数据可以是字符也可以是字节型数据,默认为字符型。POST请求默认情况下不会被浏览器所缓存。
- HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头度中的元信息。
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除Request-URI所标识的资源。
GET和POST的区别(重要,面试常问)
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST则没有。对参数的数据类型GET只接受ASCII字符,而POST即可是字符也可是字节。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
5)HTTP协议的响应报文
服务端接收到客户端的请求消息,并将处理信息返回给客户端,以此来表示响应。当服务器收到浏览器的请求后,会发送响应消息给浏览器。一个完整的响应消息主要包括:响应行、响应头信息和响应体。
格式:
举例:
响应行:
HTTP/1.1 200 OK
- 响应行中的状态码:
和请求消息相比,响应消息多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果
常见状态码及含义:
- 200 - 请求成功,已经正常处理完毕
- 301 - 请求永久重定向,转移到其它URL
- 302 - 请求临时重定向
- 304 - 请求被重定向到客户端本地缓存
- 400 - 客户端请求存在语法错误
- 401 - 客户端请求没有经过授权
- 403 - 客户端的请求被服务器拒绝,一般为客户端没有访问权限
- 404 - 资源未找到,客户端请求的URL在服务端不存在
- 500 - 服务端出现异常
响应头:
响应头用于告知浏览器当前响应中的详细信息,浏览器通过获取响应头中的信息可以知道应该如何处理响应结果。响应头中信息的格式为key :value
。
- Date:响应的Date使用的是GMT时间格式,表示响应消息送达时间。
- Server:服务器通过这个Server告诉浏览器服务器的类型。
- Vary:客户端缓存机制或者是缓存服务器在做缓存操作的时候,会使用到Vary头,会读取响应头中的Vary的内容,进行一些缓存的判断。
- Content-Encoding:文档的编码(Encode)方式。用gzip压缩文档能够显著地减少HTML文档的响应时间。
- Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
- Content-Type:表示响应的文档属于什么MIME类型。客户端基于当前关键字选择合适的语言类型进行解析响应数据;
响应体:响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
6)MIME类型
MIME(
) 多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
在服务端我们可以设置响应头中Content-Type
的值来指定响应类型;
作用:
HTTP协议所产生的响应中正文部分可以是任意格式的数据,HTTP协议采用MIME协议来规范正文的数据格式,以此保证接收方能看得懂发送方发送的正文数据;
MIME类型对应列表:
Type | Meaning |
application/msword | Microsoft Word document |
application/octet-stream | Unrecognized or binary data |
application/pdf | Acrobat (.pdf) file |
application/postscript | PostScript file |
application/vnd.lotus-notes | Lotus Notes file |
application/vnd.ms-excel | Excel spreadsheet |
application/vnd.ms-powerpoint | PowerPoint presentation |
application/x-gzip | Gzip archive |
application/x-java-archive | JAR file |
application/x-java-serialized-object | Serialized Java object |
application/x-java-vm | Java bytecode (.class) file |
application/zip | Zip archive |
audio/basic | Sound file in .au or .snd format |
audio/midi | MIDI sound file |
audio/x-aiff | AIFF sound file |
audio/x-wav | Microsoft Windows sound file |
image/gif | GIF image |
image/jpeg | JPEG image |
image/png | PNG image |
image/tiff | TIFF image |
image/x-xbitmap | X Windows bitmap image |
text/css | HTML cascading style sheet |
text/html | HTML document |
text/plain | Plain text |
text/xml | XML |
video/mpeg | MPEG video clip |
video/quicktime | QuickTime video clip |
2.1.3 DNS协议
域名系统(
)是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便地访问互联网,而不用去记住那些能够被机器直接读取的IP地址;
2.1.4 SNMP协议
简单网络管理协议,专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。
2.2 传输层协议
传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使进程看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道;
2.2.1 TCP协议
传输控制协议 TCP(
)是一种面向连接的、可靠的、基于字节流的传输层(
)通信协议。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制;此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
TCP协议传输特点
TCP是一个可靠的传输协议,在创建连接时会经历三次握手,在断开连接时会经历四次挥手。TCP 三次握手,其实就是 TCP 应用在发送数据前,通过 TCP 协议跟通信对方协商好连接信息,建立起TCP的连接关系。
- 建立链接的三次握手:
所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立;
- 第一次握手:客户端发送 SYN报文,并进入 SYN_SENT状态,等待服务器的确认;
- 第二次握手:服务器收到 SYN报文,需要给客户端发送 ACK 确认报文,同时服务器也要向客户端发送一个 SYN 报文,所以也就是向客户端发送 SYN + ACK 报文,此时服务器进入 SYN_RCVD状态;
- 第三次握手:客户端收到 SYN + ACK报文,向服务器发送确认包,客户端进入 ESTABLISHED 状态。待服务器收到客户端发送的 ACK 包也会进入 ESTABLISHED状态,完成三次握手。
- 断开连接的四次挥手:
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
- 第一次挥手:客户端发起 FIN包(FIN = 1),客户端进入 FIN_WAIT_1 状态。TCP 规定,即使 FIN包不携带数据,也要消耗一个序号。
- 第二次挥手:服务器端收到 FIN包,发出确认包 ACK(ack = u + 1),并带上自己的序号 seq=v,服务器端进入了 CLOSE_WAIT状态。这个时候客户端已经没有数据要发送了,不过服务器端有数据发送的话,客户端依然需要接收。客户端接收到服务器端发送的 ACK后,进入了FIN_WAIT_2状态。
- 第三次挥手:服务器端数据发送完毕后,向客户端发送FIN包(seq=w ack=u+1),半连接状态下服务器可能又发送了一些数据,假设发送 seq 为 w。服务器此时进入了 LAST_ACK状态。
- 第四次挥手:客户端收到服务器的 FIN包后,发出确认包(ACK=1,ack=w+1),此时客户端就进入了TIME_WAIT状态。注意此时 TCP 连接还没有释放,必须经过2*MSL后,才进入CLOSED状态。而服务器端收到客户端的确认包ACK后就进入了CLOSED状态,可以看出服务器端结束 TCP 连接的时间要比客户端早一些。
2.2.2 UDP协议
用户数据报协议 UDP(
)是不具有可靠性的数据报文协议。虽然可以确保发送消息的大小,却不能保证消息一定会到达。
2.3 网络层协议
网际协议是一个网络层协议,它包含寻址信息和控制信息 ,可使数据包在网络中路由;
2.3.1 IP协议
IP协议(Internet Protocol网际互连协议),它主要是完成两个任务,一个是寻找地址,第二个是管理分割数据片。
2.3.2 ICMP协议
ICMP 的主要功能包括,确认 IP 包是否成功送达目标地址,通知在发送过程当中 IP 包被废弃的具体原因,改善网络设置等。
2.3.3 ARP协议
ARP协议(
地址解析协议)是一个位于TCP/IP协议群中的网络层,负责将某个IP地址解析成对应的MAC地址。
主机将包含目标IP地址信息的ARP请求广播到网络中的所有主机,并接收返回消息,以此确定目标IP地址的物理地址。
2.4 服务端口
端口号用来识别计算机中进行通信的应用程序。因此,它也被称为程序地址。一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地进行数据传输。
端口分配:
实际的工作原理:
- 所谓复用,是指根据应用进程发送的应用报文类型分配该类型的端口号,一个端口号代表唯一一种进程;
- 所谓分用,是指根据收到的IP数据报中的协议字段确定相应的数据报类型,上交对应的运输层协议,再根据端口号上交对应的进程;
熟知端口号:
2.6 数据报的处理流程
网络中传输的数据包由两部分组成:
- 一部分是协议所要用到的首部;
- 另一部分是上一层传过来的数据;
致谢&出处:B站@湖科大教书匠、百战程序员JavaWeb课程;