什么是 HTTP?
- HTTP 协议构建于
TCP/IP
协议之上,是一个应用层协议,默认端口号是80
- HTTP 是无连接
无状态
的
互联网分层模型
其实网络分层模式标准有很多,各大厂商有自己的标准但是为了提升标准化,提供兼容性。国际标准化组织 ISO 提出来一套标准的基础分层模式 OSI(Open System Interconnection Reference Model,开放系统互连参考模型)
- 物理层: 在设备之间传输比特流,规定了电平、速度和电缆针脚。
- 数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用 MAC 地址)来访问介质,并进行差错检测。
- 网络层:提供逻辑地址,供路由器确定路径。
- 传输层:提供面向连接或非面向连接的数据传递以及进行重传前的差错检测。
- 会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
- 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。
- 应用层:OSI 参考模型中最靠近用户的一层,为应用程序提供网络服务 。
我们做为前端开发,接触最多的也就是应用层,当然全方位了解网络传输规范有助于我们发现 bug,优化性能
HTTP
协议是以 ASCII
码传输。规范把 HTTP
请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
<method>
<request-URL>
<version>
<headers>
<entity-body>
HTTP
定义了与服务器交互的不同方法,最基本的方法有 4
种:GET
, POST
, PUT
, DELETE
。
注意一点就是GET
提交的数据量受 URL
长度限制,虽然本质上 HTTP
协议上并没有对长度做限制但是,出于安全考虑浏览器厂商会有不同的设置标准
简单来说 HTTP
协议是解决如果包装应用数据
上面说了 HTTP
是基于TCP/IP
的那么TCP/IP
又是什么?
TCP/IP
其实是分开的,由 TCP
协议+IP
协议
TCP
属于传输层协议用于规范解决数据如何在网络中传递他是属于传输层的。IP
协议属于网络层,他用来解决信息传递到路由的部分,可以理解为网络分发的部分
上面俩个对应数据传传输是息息相关的,所有一般都直接说TCP/IP
其实就指的是这具体俩层协议
TCP 的特性
- TCP 提供一种面向连接的、可靠的字节流服务
- 在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCP
- TCP 使用校验和,确认和重传机制来保证可靠传输
- TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复
- TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制
注意:TCP 并不能保证数据一定会被对方接收到,因为这是不可能的。TCP 能够做到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说 TCP 也不是 100% 可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。
TCP 三次握手
所谓三次握手(Three-way Handshake),是指建立一个 TCP
连接时,需要客户端和服务器总共发送 3
个包。
三次握手的目的是连接服务器指定端口,建立 TCP
连接,并同步连接双方的序列号和确认号,交换 TCP
窗口大小信息。在 socket
编程中,客户端执行 connect()
时。将触发三次握手。
第一次握手
(SYN=1, seq=x)
: 客户端发送一个 TCP 的 SYN 标志位置 1 的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。发送完毕后,客户端进入 SYN_SEND 状态。
第二次握手
(SYN=1, ACK=1, seq=y, ACKnum=x+1)
:服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为 1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加 1,即 X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手
(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为 0,ACK 标志位为 1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写 ISN 的+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。
TCP 四次挥手
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。
第一次挥手
(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为 1 的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
发送完毕后,客户端进入 FIN_WAIT_1 状态。
第二次挥手
(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。
第三次挥手
(FIN=1,seq=y)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为 1。
发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK。
第四次挥手
(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待可能出现的要求重传的 ACK 包。
服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。
传输层还有一种常见的协议叫 UDP
UDP
是一个简单的传输层协议。和 TCP
相比,UDP
有下面几个显著特性:
- UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据 报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次
- UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收 方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。
- UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。UDP 发送数据报之前也不需要经过握手创建连接的过程。
- UDP 支持多播和广播。
IP 协议
IP
协议位于 TCP/IP
协议的第三层——网络层。与传输层协议相比,网络层的责任是提供点到点(hop by hop)
的服务,而传输层(TCP/UDP)则提供端到端(end to end)
的服务。