码迷,mamicode.com
首页 > Web开发 > 详细

网络编程(3)——初探HTTP协议

时间:2015-02-27 13:41:45      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:android   http   tcp   

背景

我们在网络编程(1)中知道:计算机之间的通信可以利用URL手段来定位资源。这种手段是基于TCP/IP协议来实现的。
所谓基于TCP/IP协议族,其实(1)中获取网络资源定位来理解比较好,从IP和端口来理解:
  • IP协议是计算机用来相互识别的通信的一种机制,每台计算机都有一个IP.用来在因特网上标识这台计算机。IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达而且没有损坏(只检查关键的头数据)。为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP协议。
  • TCP协议确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。一些端口号为不同的服务保留,而且这些端口号是众所周知。
 一般地,这两个协议是一起工作的。TCP 负责应用软件(浏览器)和网络软件(服务端上的)之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至接受者,传输过程要经IP路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们。

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是基于TCP协议之上(借助网上的图片)

网络模型

技术分享

响应模型

技术分享

由于HTTP是一个无状态的协议。无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。

工作流程

一下测试数据全部使用抓包工具Wireshark  点击下载抓包工具

(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请求了。
技术分享

(3)建立TCP连接后发起http请求
技术分享
查看http请求内容(红框分别为请求行和请求报头)
技术分享
(4)服务器响应http请求,浏览器得到html代码
技术分享

 经过(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加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
  • 无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传。




网络编程(3)——初探HTTP协议

标签:android   http   tcp   

原文地址:http://blog.csdn.net/u010794180/article/details/43966179

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!