前面的话

  上一篇中,介绍了网络基础。本文将详细介绍客户机在浏览网页abc.com时,数据在网络中的传输过程

  以图为例,PC1通过HTTP协议访问位于Server上的网页。那么,网页数据在网络中是如何传输的呢?下面是具体的实现步骤

步骤一:客户机处理

  HTTP协议的职责是生成针对目标WEB服务器的HTTP请求报文,该报文就是需要传递的数据

  下沉到传输层后,由于HTTP协议使用的是TCP协议,为了方便通信,将HTTP请求报文按序号分为多个报文段(segment),并对每个报文段进行封装。PC1使用本地一个大于1024以上的随机TCP源端口(这里假设是1030)建立到目的服务器TCP80号端口的连接,TCP源端口和目的端口被加入到报文段中,学名叫协议数据单元(Protocol Data Unit, PDU)。因TCP是一个可靠的传输控制协议,传输层还会加入序列号、窗口大小等参数

  传输层封装后的数据分段下沉到网络层后,封装网络层的头部,主要就是添加源和目的IP地址,成为数据包。用户通常使用主机名或域名来访问服务器,这时就需要通过应用层的DNS服务来通过域名查找IP地址,或逆向从IP地址反查域名。这里的源IP地址是193.1.1.2,目的IP地址是195.1.1.2

  网络层封装后的数据包下沉到数据链路层,封装帧头和帧尾。帧尾是添加被称做CRC的循环冗余校验部分。帧头主要是添加数据链路层的地址,即数据链路层的源地址和目的地址,用在以太网上的体现就是添加源MAC地址和目的MAC地址。PC1比较要去往的目标IP地址,发现服务器的IP地址195.1.1.2不在本地网络中,PC1知道要发往不同网络中的数据包,首先要发往网关,也就是图中路由器R1快速以太网接口Fa0/0的1P地址193.1.1.1。PC1査询本地的ARP缓存,如果找到193.1.1.1对应的MAC地址则进行封装;如果在ARP缓存中没有找到193.1.1.1对应的MAC地址,则使用ARP协议,査询到网关对应的MAC地址 “00-11-BC-7D-25-03” 。于是,这里的源MAC地址是PC1的MAC地址“00-1B-24-7D-25-01”,目的MAC地址是网关的MAC地址 “00-11-BC-7D-25-03”

  数据链路层封装后的数据帧下沉到物理层,转换成二进制形式的比特(Bit)流,从PC1的网卡发送出去。物理层的用途就是处理比特流,把比特转换成电子、光学或微波信号。反之在接收端,物理层从传输媒体中重新得到这些信号,恢复成比特流,传输比特流到数据链路层

  [注意]协议数据单元在应用层、表示层和会话层被称做数据(Data),在传输层被称做分段(Segment),在网络层被称做包(Packet),在数据链路层被称做帧(Frame),在物理层被称做比特(Bit)

  

  

  [注意]目的MAC地址是路由器接口的MAC地址,而不是目的服务器网卡的MAC地址。因为MAC只是用在局域网内的寻址,如果封装的是目的服务器的MAC地址,如何体现这个包是发往路由器的呢?假设封装的目的MAC地址是服务器的MAC地址 “00-1B-24-7D-25-05”,这样的数据包被传到路由器后,路由器比较数据帧中的R的MAC地址,发现与本路由器接口的MAC地址不同,路由器丢弃这个包,数据包不被路由器转发,更别想能到达目的服务器了

  

步骤二:集线器处理

  PC1发出的比特流到达集线器,集线器简单地对比特流进行放大,从除接收端口以外的所有端口转发出去。PC2接收到这个数据包,把比特流转换成帧上传到数据链路层,PC2比较数据帧的目的MAC地址,发现与本机网卡的MAC地址不同,PC2丢弃该数据帧,放弃处理

步骤三:路由器1处理

  路由器R1收到该比特流,转换成帧上传到数据链路层,路由器R1比较数据帧的目的MAC地址,发现与路由器接收端口Fa0/0(快速以太网,简写成Fa0/0,指的是0号插槽上编号为0的接口)的MAC地址相同,路由器知道该数据帧是发往本路由器的。路由器R1的数据链路层把数据帧进行解封装,然后上传到路由器R1的网络层,路由器R1看到数据包的目的IP地址是195.1.1.2,并不是发给本路由器的,需要路由器进行转发

  路由器R1査询自己的路由表,发现数据包应该从串行接口S1/1发出。路由器R1把数据包从Fa0/0接口交换到S1/1接口

  此时R1并不能直接把这个数据包发出去,因为在R1的Fa0/0接口被解封装,现在需要被重新再封装。可以想象一个风雪交加的日子,进门的时候拿下帽子,出门的时候需要再戴上帽子。数据封装也是这样,在路由器的入接口解封装,在路由器的出接口需要再封装,和人取下帽子有区别的是,这里解封装去掉的内容和再封装加上去的内容是不一样的。网络层的封装并没有被解开,但并不意味着网络层的信息一点都没有改变,其实网络层的数据包中源和目的IP地址都没有被改变(除非在网络地址转换的情况下),但TTL(生存周期)会减1。网络层把数据包交给下层的数据链路层,数据链路层需要封装二层的地址。串行链路不同于以太网,因为以太网是一个多路访问的网络,要定位到目的设备需要借助于MAC地址,但串行线路一般的封装协议都是PPP(Point-to-Point Protocol,点到点协议)或HDLC(High-Level Data Link Control,高级数据链路控制协议)封装,这种封装被用于点对点线路,也就是说,一根线缆只连接两台设备,一端发出,另一端肯定可以收到。假设串行线缆上使用的是PPP协议,则数据链路层封装的源和目的地址都是PPP

  数据链路层封装后的数据帧被传到物理层,转换成二进制形式的比特流,从路由器R1的S1/1接口发送出去

步骤四:路由器2处理

  路由器R2收到这个比特流,上传至数据链路层,数据链路层去掉PPP的封装。路由器R2査询数据包的目的IP地址,发现该IP网络直接连接在Fa0/0接口,路由器R2把数据包交换到Fa0/0接口。路由器查看本地的ARP缓存,如果找到195.1.1.2对应的MAC地址,则直接进行封裝;如果没有找到,则发送ARP的查询包。路由器R2发出数据帧的源地址是Fa0/0接口的MAC地址,目的地址是服务器网卡的MAC地址

  数据链路层封装后的数据帧被传到物理层,转换成二进制形式的比特流,从路由器R2的Fa0/0接口发送出去

 

步骤五:交换机处理

  路由器R2发出的比特流到达交换机,交换机除了对比特流进行放大外,还根据源MAC地址进行学习,根据目的MAC地址进行转发。交换机根据数据帧中的目的MAC地址査询MAC地址表,把比特流从对应的端口发送出去,交换机把比特流发往服务器,并没有发往PC3

步骤六:服务器处理

  服务器接收到这个比特流,把比特流转换成帧格式,上传到数据链路层,服务器发现数据帧中的目的MAC地址与本网卡的MAC地址相同,服务器拆除数据链路层的封装后,把数据包上传到网络层。服务器的网络层比较数据包中的目的IP地址,发现与本机的IP地址相同,服务器拆除网络层的封装后,把数据分段上传到传输层。传输层对数据分段进行确认、排序、重组,确保数据传输的可靠性。数据最后被传到服务器的应用层

  从PC1到Server的整个数据包流动过程,PC1执行OSI七层的封装,然后把比特流传到集线器;集线器在物理层把信号简单放大后,把比特流传到路由器R1;R1执行OSI下三层的处理后,再把比特流传到路由器R2;R2执行OSI下三层的处理后,再把比特流传到交换机;交换机执行OSI下二层的处理后,再把比特流传到服务器

  从这个流动过程中,可以发现数据流在中间设备上主要执行的是OSI下三层的操作,物理层的设备不改变帧的格式,广播式转发:数据链路层的设备也不改变帧的格式,但可以根据数据帧中的目的MAC地址进行转发;网络层的设备改变帧的格式,要执行帧的解封装和再封装,但不改变数据包中的源和目的IP地址

步骤七:反向传输

  服务器收到PC1发过来的数据后,对PC1进行响应。和PC1处理的过程类似,服务器也知道要发往一个远程的网络,数据链路层的目的MAC地址需要封装网关的MAC地址;网络层源和目的IP地址与PC1发送过来的包相反,即把源地址变成目的地址,目的地址变成源地址;传输层源和目的端口与PC1发送过来的包相反,即把源端口变成目的端口,目的端口变成源端口

// 0){
return;
}
if(select[i].getBoundingClientRect().top 0){
change(oCon.children[i+2])
}
}else{
change(oCon.children[select.length+1])
}
}

}
document.body.onmousewheel = wheel;
document.body.addEventListener('DOMMouseScroll',wheel,false);

var oCon = document.getElementById("content");
var close = oCon.getElementsByTagName('span')[0];
close.onclick = function(){
if(this.innerHTML == '显示目录'){
this.innerHTML = '×';
this.style.background = '';
oCon.style.border = '2px solid #ccc';
oCon.style.width = '';
oCon.style.height = '';
oCon.style.overflow = '';
oCon.style.lineHeight = '30px';
}else{
this.innerHTML = '显示目录';
this.style.background = '#3399ff';
oCon.style.border = 'none';
oCon.style.width = '60px';
oCon.style.height = '30px';
oCon.style.overflow = 'hidden';
oCon.style.lineHeight = '';
}
}
for(var i = 2; i

前端学HTTP之数据传输的更多相关文章

  1. 前端学做 PPT

    前端学做 PPT 公司做技术分享.年终总结都需要用到ppt. 要快速.省事的做出高质量的 ppt,一方面需要熟练使用制作 ppt 的工具,另一方面得知道用工具做成什么样子才是好作品.前者比较简单,后者 ...

  2. 前端学HTTP之网络基础

    × 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...

  3. 前端学HTTP之连接管理

    前面的话 HTTP连接是HTTP报文传输的关键通道.要掌握HTTP就需要理解HTTP连接的来龙去脉以及如何使用这些连接 如果想查看一个网页,浏览器收到URL时,会执行下图所示的步骤.将服务器的IP地址 ...

  4. 前端学HTTP之基本认证

    前面的话 人们用Web进行私人事务处理,访问私有的数据.通过Web可以很方便地访问这些信息,但仅仅是方便访问还是不够的.我们要保证只有特定的人能看到我们的敏感信息并且能够执行我们的特权事务 服务器需要 ...

  5. 前端学HTTP之缓存

    前面的话 Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关内容 功能 ...

  6. 前端学HTTP之WEB服务器

    前面的话 Web服务器每天会分发出数以亿计的Web页面,它是万维网的骨干.本文主要介绍WEB服务器的相关内容 总括 Web服务器会对HTTP请求进行处理并提供响应.术语“Web服务器”可以用来表示We ...

  7. mongodb - 前端form表单数据传输,在保存和清除的数据格式的处理程序的 - 非递归

    //处理时间段,将ISODate("2014-10-09T18: 37: 50.0Z") 兑换 2014-10-09 18:37:50这样的格式 //截至处理6层树形结构数据,当多 ...

  8. 前端学PHP之自定义模板引擎

    前面的话 在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构 ...

  9. 前端学PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

随机推荐

  1. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  2. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

  3. Partition2:对表分区

    在SQL Server中,普通表可以转化为分区表,而分区表不能转化为普通表,普通表转化成分区表的过程是不可逆的,将普通表转化为分区表的方法是: 在分区架构(Partition Scheme)上创建聚集 ...

  4. App你真的需要么

    随着智能手机.移动路联网的普及,APP火的一塌糊涂,APP应用可谓五花八门,街上经常看到各种推广:扫码安装送东西,送优惠券.仿佛一夜之间一个企业没有自己的APP就跟不上时代了. 有时我在想:APP,你 ...

  5. 两个 viewports 的故事-第二部分

    原文链接:A tale of two viewports — part two 译者:nzbin 在这个迷你系列中,我将解释 viewports 和各种重要元素的宽度是如何工作的,比如说 <ht ...

  6. PHP之时间和日期函数

    // 时间日期函数 Time <?php date_default_timezone_set('UTC'); // 获取当前时间的时间戳 $time0 = mktime(); $time1 = ...

  7. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  8. .net core和angular2之前端篇—1

    2016-10-20更新 今天的这篇文章还是一篇"Hello World",只不过开发环境有所改变--Visual Studio Code+Angular2+Webapck,也算是 ...

  9. SQL数据类型

    1.Character 字符串: 数据类型 描述 存储 char(n) 固定长度的字符串.最多8,000个字符. n varchar(n) 可变长度的字符串.最多8,000个字符.   varchar ...

  10. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...