网络编程(3)——初探HTTP协议
背景
- IP协议是计算机用来相互识别的通信的一种机制,每台计算机都有一个IP.用来在因特网上标识这台计算机。IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达而且没有损坏(只检查关键的头数据)。为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP协议。
- TCP协议确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。一些端口号为不同的服务保留,而且这些端口号是众所周知。
网络模型
响应模型
工作流程
(1)域名解析地址
从网络编程(1)看到,我们访问www.baidu.com只是一个域名,需要一个“域名系统”帮我们找到真实的IP地址。一般的,会从我们的浏览器DNS缓存中,查看我们之前是否有访问过这个网站,如果有就找到对应的IP条目进行访问;如果没有则默认会从自己的主机host文件(位于C:\Windows\System32\drivers\etc)中查找,如果有就直接访问;如果没有这时就需要请求我们本地配置的DNS服务器(这个一般是我们的网络供应商提供的),发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求。首先先从根域的DNS的IP地址(A),问A“www.baidu.com的IP地址是多少?”A一看发现不知道这个的IP地址是多少,不过他知道B管“com”这类顶级域的IP地址,于是告诉让我去找B。找到B后问他“www.baidu.com的IP地址是什么?”然而B只知道“baidu.com”这类权限域名归C管,让我去找C。于是又跑到C那里问“www.baidu.com的IP地址是什么?”,最后C在自己的服务器上一查发现有对应的IP条目,就返回告诉了我们。并返回给Windows系统内核,内核又把结果返回给浏览器,终于浏览器拿到了并缓存起来。
(2)发起TCP的3次握手
那么我们进过(1)步骤解析出IP地址之后,我们需要在两个主机之间建立连接,分为3次握手。
- Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复
- Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server
自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
- Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
经过(1)-(4)之后 浏览器解析html代码,并请求html代码中的资源(图片等)并对页面进行渲染呈现给用户。我们从请求报头里面看到Connection:keep-alive。一般来说一个连接请求完毕后会释放TCP连接。由于与服务器频繁的交互,所以keep-alive能够保持与服务器的“连接”,无需每次都断开,减少开销。
传输模型
客户端将请求封装成http数据包-->封装成Tcp数据包-->封装成Ip数据包--->封装成数据帧--->硬件将帧数据转换成bit流(二进制数据)-->最后通过物理硬件(网卡芯片)发送到指定地点;服务器硬件首先收到bit流,然后转换成ip数据包。于是通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。
总结特点
- 模式:支持客户/服务器。(客户端←→服务端)
- 简单灵活:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST等方法,方法规定了客户与服务器联系的类型不同。同时HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
- 无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。