Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP相关的一些基础知识浅谈 #14

Open
mhfe123 opened this issue Dec 12, 2018 · 0 comments
Open

HTTP相关的一些基础知识浅谈 #14

mhfe123 opened this issue Dec 12, 2018 · 0 comments

Comments

@mhfe123
Copy link
Contributor

mhfe123 commented Dec 12, 2018

我所认为的网络协议的核心

作为一个开发,一个绕不开的问题就是网络,说到网络我们又会想到网络协议,那么我们常说的网络协议又是什么呢?通常我们说的网络协议指的是TCP/IP协议族,是互联网所有相关协议的一个总称,而HTTP协议只是他下边的一个子集。当然也有说法任务TCP/IP是指TCP和IP两种协议,还有的是认为TCP/IP是在IP协议的通信过程中使用到的协议族的统称。

那么其核心又是什么呢?我认为TCP/IP协议族最重要的是它分层管理的思想。TCP/IP协议族按层次分为了应用层、传输层、网络层和数据链路层四层结构。所有的设计都是在这四层结构上进行的,这样就会有一个好处,如果有地方需要变动,只需要把对应层的东西进行修改就可以了,最重要的是分工明确,应用层只考虑分配给自己的任务就可以了,而不需要关心怎么传输,能不能送达一类的问题,职能划分明确,简单明了。

那么每层都做了什么事情呢?

  • 应用层

    决定了向用户提供应用服务时的通信活动。TCP/IP协议族内预存了各类通用的应用服务,如FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务等,我们常说的HTTP协议也是处于该层。

  • 传输层

    传输层是应用层的上层,提供处于网络连接中的两台计算机之间的数据传输。传输层主要包含两个协议TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

  • 网络层(网络互连层)

    网络层是用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(即传输路线)到达对方的计算机,并把数据包传送给对方。当与对方计算机之间通过对台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。我们所熟知的如IP协议就是属于这一层。

  • 链路层(数据链路层,网络接口层)

    用来处理网络连接的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均属于链路层

一个网络请求的历程

下面我们那HTTP请求为例来分析一下一个网络请求从发出到完成的主要经历。

首先我们需要了解几个与HTTP密切相关的协议:IP、TCP和DNS。

  • 负责传输的IP协议

    IP(Internet Protocol)协议位于网络层,几乎所有使用网络的系统都会用到IP协议。注意IP跟IP地址是不同的概念,IP是指的协议名称。

    IP协议的作用是把各种数据包传送给对方,而要保证确实传送到对方那里,需要满足各类条件,其中两个重要条件是IP地址和MAC地址(Media Access Control Address)。

    IP地址指明了节点被分配的地址,MAC地址是指网卡所属的固定地址。IP地址和MAC地址进行配对,IP地址可以变换,但MAC地址基本不会更改。

  • 确保可靠性的TCP协议

    上面讲了TCP时候位于传输层的,其主要是提供可靠的字节流服务。

    所谓字节流服务(Byte Stream Service)是指为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指能够把数据准确可靠的传给对方,一句话说就是TCP协议为了更容易传送大数据把数据进行分割,并且能够保证数据最终准确送给对方。

    那TCP协议是怎么实现可靠性呢?这里就采用了我们所熟知的三次握手策略(three-way handshaking)。握手过程中使用了TCP的标志SYN(synchronize)和ACK(acknowledgement)。

    首先发送端发送一个带有SYN标志的数据包给对方,接收端收到后回回传一个带有SYN/ACK标志的数据包给发送端表示确认收到信息。然后发送端收到信息后会再回传一个带ACK标志的数据包给接收端,代表握手结束。如果传输中断,发送端会继续以相同的顺序发送相同的数据包。当然除了三次握手以外TCP协议还有其他各种手段保证通信的可靠。

  • 负责域名解析的DNS服务

    DNS服务和HTTP协议是一样位于应用层的,它提供域名到IP地址之间的解析服务。计算机既可以被赋予IP地址,也可以被赋予主机名和域名。比如www.baidu.com。通常我们都是通过主机名或域名来访问对方的计算机,而不是直接输入IP地址访问。但是域名或主机名对人类来讲比较容易记忆,但是让计算机去理解就会比较困难,所以就有了DNS服务的诞生,DNS协议提供通过域名查找IP地址或逆向从IP地址反查域名的服务。

总结:了解了这几个协议那么我们一个网络请求的历程就会比较清晰了,首先用户输入一个地址www.baidu.com给客户端,然后客户端就会去找DNS服务问www.baidu.com的IP地址是什么,然后DNS把IP地址返回给客户端,然后HTTP协议会根据IP地址生成针对对应Web服务器的HTTP请求报文,这时候请求从应用层来到了传输层,到传输层以后TCP协议就会把HTTP请求的报文分割成报文段,并把每个报文段可靠的传给服务器,传输过程会经过网络层,IP协议根据IP地址搜索对应的服务器,经过我们的网线之类的硬件传到服务器服务端又会通过这一端的TCP协议将客户端发送过来的报文段按原先的顺序组合成完整的数据告诉服务器,然后服务器得到数据后就会把相应的信息按原路返回到客户端。

简化过程就是 客户端应用层--->传输层--->网络层--->链路层--->网络层--->传输层--->服务端应用层。

具体的引用一张图片来说明:
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant