HTTP GET请求中所涉及到的网络协议

zebra007 2005-07-02 11:24:56
HTTP GET请求中所涉及到的网络协议
Puff (QQ:391741041)

Java的产生与发展与网络有着密切的关系。所以我们在学习java的同时,应该对网络体系结构和网络协议有一个大概的认识和了解。这样才能有助于我们做出更好的应用程序。

在对以下内容进行学习之前,要求你对TCP/IP协议栈有一个简单的了解。要知道网络分层的结构;层与层之间完成相对独立的功能;在上层产生的数据包,会传递给下层,并加上下层的数据包头(header);上层从下层获取数据的过程相反。图1是TCP/IP的体系结构图,注意图中对TCP/IP协议栈的协议描述并不完全。之所以会称之为TCP/IP协议,是因为他们是这个协议栈中最为重要的两个协议。


以下根据马萨诸塞州大学计算机科学系Don Towsley在2004年秋季的网络课程录像中节选的一小段的内容加以翻译和整理。对我们用http(超文本传输协议)向一个web服务器发出一个GET请求时网络所做的工作、以及都使用了哪些协议加以描述。如果大家对这个课程有兴趣,可以在http://www-net.cs.umass.edu/cs653/下载,不过总的视频文件大小有1.88G,网速慢的就不要下载了:)。

1. 用户在web浏览器(如IE)地址栏输入URL(统一资源定位符),比如http://www-net.cs.umass.edu/cs653/。前面的http是协议类型,后面的www-net.cs.umass.edu指被访问的服务器的域名,没有加冒号和端口号表示访问的是默认的端口号80。
2. 由于所发出的数据要通过被访问主机的IP地址进行传输和路由,所以要先通过DNS(域名服务器)服务器将域名解析为IP地址(假设DNS和我们的主机在一个网段):
a) 主机产生一个DNS请求;
i. 传递给传输层,通过UDP(User Datagram Protocol, 用户数据报协议)产生一个UDP 报文(Segment);
ii. 传递给网络层产生一个IP报文(Packet),目的地址是DNS服务器的IP地址(这个地址可能是手工设置的,也可能是通过DHCP(动态主机配置协议)协议自动获得的);
iii. 在数据链路层通过ARP(Address Resolution Protocol,地址解析协议)协议得到DNS服务器的MAC(媒体访问控制子层)地址
iv. 把数据帧(frame)通过以太网传输给DNS服务器
v. DNS服务器将收到的帧向上传给传输层,得到UDP报文。通过UDP报文中指定的端口号传给DNS应用程序。为了表述简单,我们假设要解析的域名在当前的DNS服务器中有相应的表项(如果不在当地,本地DNS服务器还要向上级的DNS服务器发出DNS查询请求,如此递归直到查到要解析的域名的IP地址)。
b) DNS把通过DNS应答将得到的IP地址返回给请求的主机。(终于知道对方的IP地址了,呵呵)
3. 现在,浏览器得到对方的IP地址了。现在可以发出GET请求吗?不!
a) 首先要和对方服务器建立一个TCP(传输控制协议,TCP和UDP同属传输层,但是TCP协议时个可靠的面向连接的协议,要比UDP复杂的多。TCP更适合要求可靠传输的应用)连接。建立连接通过三次握手方法。
b) 这里和以下发送的TCP报文同样要传给下一层:网络层。在Internet中也就是我们说的IP层。同样的,IP层给TCP报文加上IP报头,发送给路由器(假设我们的主机和web服务器不在同一个网内),路由器根据报文中的目的IP地址决定下一跳(Next Hop)的IP地址和端口。这个决定需要查询(lookup)它自身的路由表(而路由表的维护需要路由协议,比如OSPF(开放最短路径优先)等)。IP报文可能通过多个路由器的转发,终于到达了对方的服务器。再剥掉IP报头递交给上层。
c) 建立好了TCP连接,以后发送的数据都可以这条可靠的连接传输了。
4. 和WEB服务器之间的TCP连接建立成功。就可以发送GET请求啦。
5. WEB服务器收到请求,就可以将响应信息通过刚才建立好的TCP连接送回给请求方。
6. 如果是一个html文件,浏览器就可以解释并将它显示在我们的显示器上面了。


注意到这个过程里面的三个重要的地址:域名、IP地址和MAC地址。它们是网络中不同的层,不同的协议所需要的地址。它们之间的关系有点像电话系统中的概念,域名对应人名(不过域名不能重复),IP地址对应电话号码,MAC地址对应程控交换机中这路电话所在的物理位置号。我们打电话首先通过人名找电话,这时电话本就像DNS一样;然后我们拿起电话拨号,程控交换机根据你拨的号码找到其电路所在位置(概念上);在两部电话之间建立一个连接;然后就可以通话了。


2005-7-1
...全文
232 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiffandu 2005-07-05
  • 打赏
  • 举报
回复
希望老大继续努力,利人利己

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧