Open System Interconnection Model (OSI)
Application Layer
- 数据:Data, [Data]
- 协议:HTTP, FTP
- 软件:浏览器,其他应用软件等
其他:
- 对于HTTP协议,应用层会委托socket库进行DNS解析,获取Host的IP,并将IP+Port+Data传输给下层协议。
- 应用层使用操作系统的socket库来和传输层、网络层通信。
Presentation Layer
数据编码,格式,解/压缩,解/加密等协商、处理。
Session Layer
向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
Transport Layer
提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。
- 数据:Segment, [TCPHeader + Data]
- 协议:TCP, UDP
- 软件:操作系统socket库
其他
- 如果应用层给的Data过大,则传输层会对Data进行切片,以满足MSS。
- 如果应用层给的Data过小,则传输层会根据一定的算法,继续等待新的数据包,避免给传输层的Data过小。
- MSS: Maximum Segment Size, 最大分段大小,[Data]的长度。
- MSS/MTU是当前层对上一层给的数据大小要求,如果不满足要求,则进行切割。如MSS是对应用层数据包大小的要求,MTU是数据链路层对网络层数据包大小的要求。
Network Layer
通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
- 数据:Packet, [MACHeader + IPHeader + TCPHeader + Data]
- 协议:IP, ICMP, ARP
- 软件:操作系统socket库;硬件:路由器
- 上述的MACHeader,是通过ARP协议,查到目的地的MAC地址,并添加至头部。MAC header由网路层添加,方便数据链路层直接传输数据。
其他
- MTU: Maximum Transmission Unit,最大传输单元, [IPHeader + TCPHeader + Data] 的长度,以太网为1500Byte
- 如果 IPHeader+TCPHeader+Data大于MTU,则网络层会对Data进行切片,即IP分片
- ping采用的是ICMP(Internet Controler Message Protocol)协议。
- ARP: Address Resolution Protocol
Data Link Layer
将上层数据封装成帧,并采用差错检测、差错控制和流量控制等方法,向网络层提供高质量的数据传输服务。
封装成帧,基于MAC进行传输
透明传输:帧中如果有和控制数据一样,则进行转换
流量控制:接收端可以及时接收,采用滑动窗口的方式
差错检测:物理线路的不稳定、误差等,采用FCS、CRC等方式进行差错检测、控制都能。
- 数据:Frame, [报头 + MACHeader + IPHeader + TCPHeader + Data]
- 协议:PPP
- 硬件:交换机,网桥
Physical Layer
提供比特流的传输
HTTP
长连接
HTTP2.0之前,请求必须按照顺序来,pipeline也需要保证顺序。 一个域名可以开启多个TCP。会有队头阻塞问题。
对于上述HTTP必须按照顺序来,那如何判断一个HTTP数据传输结束了呢?
- Content-Length
-
Transfer-Encoding: chunked
25 // 数据块以数据大小(字节数)开头,跟随一个CRLF This is the data in the first chunk // 数据的内容,并以CRLF结束 1C and this is the second one 3 con 8 sequence 0 // 最后一个块大小为0,表示结束
好处:
a) 可以边压缩边传输数据。
b) 分块传输编码允许服务器在最后发送消息头字段。对于那些头字段值在内容被生成之前无法知道的情形非常重要,例如消息的内容要使用散列进行签名,散列的结果通过HTTP消息头字段进行传输。没有分块传输编码时,服务器必须缓冲内容直到完成后计算头字段的值并在发送内容前发送这些头字段的值。
HTTP2.0,采用多路复用的方式,解决上述问题,并且增加了头部压缩、服务质量等。
三次握手
第一次握手:客户端发送SYN包(SYN=1, SeqNum=x)至服务端,发送后,客户端进入SYN_SENT状态。这一步消耗一个序号。不能携带数据,防止SYN攻击。
第二次握手:服务端收到SYN包后,进入SYN_RECVD状态,同时回传SYN+ACK包(SYN=1,SeqNum=y, ACK=1, AckNum=x+1)至客户端。这一步也消耗一个序号。实际上是可以携带数据的,但是此时又不知道客户端请求的资源是什么,所以也不知道回传什么数据。
第三次握手:客户端收到服务端的SYN包后,进入Established状态,同时发送ACK包(SeqNum=x+1, ACK=1, AckNum=y+1)至服务端,服务端收到该报后,也进入Established状态,握手完成。 这一步,可以携带数据。
SYN: Synchronize
SeqNum: Sequence Number
AckNum: Acknowledge Number
为什么三次握手:
- TCP是面向连接的,开始通讯之前,需要交换控制信息,如:SeqNum,AckNum,窗口大小等
- 所以至少需要2次握手,互相交换控制信息
- 第三次握手,可以防止失效的报文又传到了Server端,造成资源浪费。如果Server端收到Client SYN包就立刻进入连接状态,会造成资源浪费,比如SYN包在网络中滞留了,Client已经认为该包丢失了,是失效的,而Server端这时候却建立连接,从而造成资源浪费;再比如Server端发出的SYN+ACK包在网络上丢失了,也会造成上述问题。
四次挥手
第一次挥手:客户端发送FIN包(FIN=1, SeqNum=u, ACK=1, Ack_Num=*),同时进入FIN-WAIT-1状态;TCP 规定,FIN 报文段即使不携带数据,也要消耗一个序号。
第二次挥手:服务端收到FIN包后,回ACK包(ACK=1, Ack_Num=u+1),同时进入CLOSE-WAIT(关闭等待)状态。客户端收到该包后,进入FIN-WAIT-2状态。
第三次挥手:服务端发送FIN包(FIN=1, SeqNum=w, ACK=1, Ack_Num=u+1),同时进入LAST-ACK(最后确认)状态。
第四次挥手:客户端收到FIN包后,回ACK包(ACK=1, Ack_Num=w+1),同时进入TIME-WAIT(时间等待)状态,此时TCP连接还没有释放,等待2MSL后,才释放连接。此时服务端收到该Fin包后,直接关闭TCP连接,进入Close状态。
为什么等待2MSL才关闭TCP连接:
MSL:Max Segment Lifetime,报文最大寿命。
- 第四次挥手包可能丢失,需要重传。也就是说,当服务端收不到最后一步的ACK包后,会重新进行第三次挥手,此时客户端会再次收到FIN包,这时候,客户端需要进行第四次挥手。该重传可以避免服务端无法正常关闭。
- 等待2MSL可以保证该TCP连接中的包已经完全失效,避免本次连接的端口重新分配给下一个TCP连接时,上一个TCP的包进入新的TCP连接造成错误。
localhost & 127.0.0.1
- On modern computer systems, localhost as a hostname translates to an IPv4 address in the 127.0.0.0/8 (loopback) net block, usually 127.0.0.1, or ::1 in IPv6.
- localhost相当于域名,需要进行一次解析,从本机Host文件解析出127.0.0.1或::1
- 127.0.0.1本地环回地址,本主机的进程间的通信之用。若主机发送一个目的地址为环回地址的IP数据报,则本主机中的协议栈就处理该数据报中数据,而不会将数据报发送到任何网络。
- Some applications will treat “localhost” specially. the mysql client will treat localhost as a request to connect to the local unix domain socket instead of using tcp to connect to the server on 127.0.0.1. This may be faster, and may be in a different authentication zone.
- 一些应用程序会特殊处理“localhost”,不会去解析为具体IP,而是直接调用本机socket,这样通信直接通过socket,不会再经过TCP/IP的传输层,速度所以会更快。也就是说,使用“localhost”不会再经过传输层、网卡、防火墙等,只在应用层以及socket间传输。
- localhost is working but not 127.0.0.1
- It’s possible that your web browser is resolving localhost on your computer to the IPv6 loopback address, ::1. Compare the results of typing http://[::1] and compare the results to http://127.0.0.1 and http://localhost to see if that reveals anything. As to why xampp/vapor is working on IPv6, but not IPv4 is another issue.
- 0.0.0.0
- 表示当前主机。在服务器中,0.0.0.0指的是本机上的所有IPv4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。
- 其他
- 主机号全为0表示:所有主机,即整个子网
- 主机号全为1表示:当前子网的广播地址
参考资料:
what-is-the-difference-between-127-0-0-1-and-localhost