OSI是 Open System Interconnection 的缩写,意为开放式系统互联。国际标准化组织(ISO)制订了 OSI 模型,该模型定义了不同计算机互联的规范,是设计和形容计算机网络通信的根本框架。OSI 模型把网络通信的工作分为 7 层,别离是 物理层 、 数据链路层 、 网络层 、 传输层 、 会话层 、 表示层 和应用层。
记忆办法:记住后面的第一个字
物 数 网 传 会 表 应
这七层每一层都有本人的作用,作用如下图合成:
2、Http
HTTP(HyperText Transfer Protocol、超文本传输协定)是 OSI 七层中应用层的协定。
协定解释:
HTTP 是基于 TCP/IP 协定的应用层协定。它不波及数据包(packet)传输,次要规定了客户端和服务器之间的通信格局,默认应用 80 端口。
有人说 HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查问后果等),我觉这句话有问题,HTTP 要是定义为协定那么 http 只是一种规定规定,规定了客户端的 URI 申请格局以及服务端数据响应格局,要说 HTTP 申请这个概念久比拟抽象了,客户端发送一次 HTTP 申请,通过 OSI 的七层协定的组装、传输、拆分、传输等一些操作,最终能够取得咱们想要的数据。
用处形容:
解决客户端和服务端的数据如何包装,包装两端最初失去的数据能够被辨认。
关系形容:
TPC/IP 协定是传输层协定,次要解决数据 如何在网络中传输,而 HTTP 是应用层协定,次要解决如何包装数据,而 socket 则是对 TCP/IP 协定的封装和利用(程序员层面上)。实际上 http 协定就是建设在 tcp/ip 协定之上的。,简直每一种语言都有本人的 Http 实现,当然也有本人的 Socket 实现,比方 Golang、Java,在本人的 net 包里都能够找到源代码。应用 TCP 协定是须要连贯三次握手,断开连接四次挥手的。
HTTP 是无状态协定,它不对之前产生过的申请和响应的状态进行治理。也就是说,无奈依据之前的状态进行本次的申请解决。然而应用 Cookie 和 Session 能够保留状态和辨认。HTTP 只能是由客户端发动,服务端是无奈被动想客户端发送数据的。
2、TCP
TCP(Transmission Control Protocol,传输控制协议)是 OSI 七层中传输层的协定。
协定解释:
TCP(Transmission Control Protocol,传输控制协议)是基于连贯的协定,也就是说,在正式收发数据前,必须和对方建设牢靠的连贯。TCP 提供超时重发,抛弃反复数据,测验数据,流量管制等性能,保证数据能从一端传到另一端。现实状态下,TCP 连贯一旦建设,在通信单方中的任何一方被动敞开连贯前,TCP 连贯都将被始终放弃上来。断开连接时服务器和客户端均能够被动发动断开 TCP 连贯的申请。
平安体现在哪儿?
连贯平安 :三次握手 四次挥手,具体请参考:TCP 详解。
数据安全:TCP 提供超时重发,抛弃反复数据,测验数据,流量管制等性能,保证数据能从一端传到另一端。
用处形容:
解决网络中的数据能够平安无错的传送
关系形容:
HTTP 协定是基于 TCP 的,因为 HTTP 申请是一次申请一次应答,因为申请和应答都只有一次,所以就必须保证数据的安全性,在这一次的传送中不好失落数据,所以 HTTP 是要基于更加平安的 TCP 协定而不是 UDP 协定,Socket 连贯能够基于 TCP 也能够基于 UDP,看具体的业务的需要了。HTTP 申请应用基于 TCP 的 Socket 连贯。
TCP 发送的包有序号,对方收到包后要给一个反馈,如果超过肯定工夫还没收到反馈就主动执行超时重发,因而 TCP 最大的长处是牢靠。个别网页(http)、邮件(SMTP)、近程连贯 (Telnet)、文件(FTP) 传送就用 TCP。
3、UDP
UDP (User Datagram Protocol, 用户数据报协定)是 OSI 参考模型中无连贯的传输层协定.
协定解释:
UDP 用户数据报协定,是一个无连贯的简略的面向数据报的运输层协定。UDP 不提供可靠性,它只是把应用程序传给 IP 层的数据报发送进来,然而并不能保障它们能达到目的地。因为 UDP 在传输数据报前不必在客户和服务器之间建设一个连贯,且没有超时重发等机制,故而传输速度很快。
用处形容:
解决网络中的数据能够高效的传送
关系形容:
OSI 参考模型中传输协定只有 TCP 和 UDP 两种,TCP 须要链接平安效率低,UDP 无线连接不平安效率高,咱们平时应用做多的 HTTP 协定基于 TCP,很多语言都有 HTTP 申请的封装,用起来很不便,然而想应用 UDP 就没那么不便了,想应用 UDP 咱们就须要本人去写一个 Socket UDP 了,Socket UDP 不须要链接,客户端晓得服务端的 IP 和端口号间接发送数据就能够了,Socket TCP 因为须要链接所以应用的时候须要心跳机制来确保链接没有断开。
UDP 个别用于多点通信和实时的数据业务,比方语音播送、视频、QQ、TFTP(简略文件传送)、SNMP(简略网络管理协定)、RTP(实时传送协定)RIP(路由信息协定,如报告股票市场,航空信息)、DNS(域名解释)。重视速度晦涩。
4、Socket
名词解释:
socket 是对 TCP 或者 UDP 协定的封装和实现,socket 并不是协定,差不多每一种语言都实现了对 TCP 和 UDP 封装和实现的 Socket 代码库,不便开发程序员应用。
用处形容:
socket 是对 TCP 或者 UDP 协定的封装和实现,这样我就能够基于你所应用语言的 Socket 来实现更多的性能,有基于 Socket TCP 的 HTTP 申请,有基于 Socket TCP 长连贯的音讯推送,也能够基于 Socket TCP/UDP 自定义一套本人的通信协议。
关系形容:
HTTP 基于 TCP,HTTP 申请须要应用 Socket TCP 来实现。
5、一次 HTTP 申请的心路历程
因为一次 HTTP 申请会波及到 HTTP TCP Socket DNS 等等,弄清楚一次 HTTP 的流程大略能够晓得网络申请的原理。那么咱们发送一次 HTTP 申请到底要经验什么?
一次 HTTP 申请和响应要经验的几个步骤:
(1)域名解析
域名解析介意是客户端的工作,客户端只有服务端的域名(相似 www.baidu.com),并不知道服务端的 IP 地址,须要客户端拿着域名到 DNS 服务器获取域名对应的 IP 地址。
(2) 建设 TCP 连贯
由客户端发动,在三次握手后客户端和服务端建设 TCP 连贯。所谓三次握手 (Three-way Handshake),是指建设一个 TCP 连贯时,须要客户端和服务器总共发送 3 个包。
三次握手的目标是连贯服务器指定端口,建设 TCP 连贯, 并同步连贯单方的序列号和确认号并替换 TCP 窗口大小信息. 在 Socket 编程中,客户端执行 connect() 时。将触发三次握手。
首先理解一下几个标记,SYN(synchronous),同步标记,ACK (Acknowledgement),即确认标记,seq 应该是 Sequence Number,序列号的意思,另外还有四次握手的 fin,应该是 final,示意完结标记。
第一次握手:客户端发送一个 TCP 的 SYN 标记地位 1 的包指明客户打算连贯的服务器的端口,以及初始序号 X, 保留在包头的序列号 (Sequence Number) 字段里。
第二次握手:服务器发回确认包 (ACK) 应答。即 SYN 标记位和 ACK 标记位均为 1 同时,将确认序号 (Acknowledgement Number) 设置为客户的序列号加 1 以,即 X +1。
第三次握手:客户端再次发送确认包(ACK) SYN 标记位为 0,ACK 标记位为 1。并且把服务器发来 ACK 的序号字段 +1,放在确定字段中发送给对方. 并且在数据段放写序列号的 +1。
(3)发动 http 申请发送申请报文
由客户端发动,客户端组装好申请报文,向服务端发送 HTTP 申请,HTTP 由固定的格局,具体想看下图:
HTTP 申请报文由 3 局部组成(申请行 + 申请头 + 申请体),这三局部还有本人的组装格局,这里就不具体阐明了。
(4)服务器端响应 http 申请
服务端收到客户端的 HTTP 申请拿到申请报文后就响应申请,就是依据申请报文解决后发送数据到客户端。服务端发送到客户端的数据叫做响应报文,由服务端组装,格局如下:
① 报文协定及版本;
② 状态码及状态形容;
③ 响应报文头,也是由多个属性组成;
④ 响应报文体,即咱们真正要的“干货”。
(5)客户端接管响应数据报文
在响应报文体外面才是咱们客户端正真想要的货色,对于 Android/IOS 挪动端来说个别都是 Json 数据,对于 web 浏览器来说个别都是 HTML,客户端取得响应报文后就解决数据。
(6)敞开 TCP 连贯
个别状况下 TCP 连贯是因为客户端被动敞开的,敞开须要客户端被动发动四次挥手,才能够敞开 TCP 连贯。个别状况下,一旦申请和响应实现了,就要敞开 TCP 连贯,而后如果客户端或者服务器在其头信息退出了这行代码:Connection:keep-alive,TCP 连贯在发送后将依然放弃关上状态,于是,客户端能够持续通过雷同的连贯发送申请。放弃连贯节俭了为每个申请建设新连贯所需的工夫,还节约了网络带宽。
TCP 的连贯的拆除须要发送四个包,因而称为四次挥手(four-way handshake)。客户端或服务器均可被动发动挥手动作,在 socket
编程中,任何一方执行 close()操作即可产生挥手操作。
其实有个问题,为什么连贯的时候是三次握手,敞开的时候却是四次挥手?
因为当 Server 端收到 Client 端的 SYN 连贯申请报文后,能够间接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来 同步的。然而敞开连贯时,当 Server 端收到 FIN 报文时,很可能并不会立刻敞开 SOCKET,所以只能先回复一个 ACK 报文,通知 Client 端,”你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,我能力发送 FIN 报文,因而不能一起发送。故须要四步握手。
举例说明客户端被动发送 TCP 敞开申请步骤:
第一次挥手:Client 发送一个 FIN,示意须要敞开 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态
第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号 +1,Server 进入 CLOSE_WAIT 状态
第三次挥手:Server 发送一个 FIN,用来敞开 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态
第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号 +1,Server 进入 CLOSED 状态,实现四次挥手
最初图解一次 HTTP 申请的心路历程: