最近面试被问到了一些<<计算机网络>>方面的问题,由于之前的工作中很少涉及到,7、8年了前学的了,都基本还给老师了,回答得不太满意。所以这几天又从头学习了一遍<<计算机网络>>,看的是人民邮电出版社出的<<图解TCP/IP>>。看完之后还要查很多资料,我并不推荐这本书,感觉是本入门书,很多细节没有讲清楚,就像今天遇到的这个问题,很多都一笔带过,讲得很淺。而网上的文章很多就抄的教科书,情况都特别理想,一个ARP过去就有回应了,真的是这样吗?要没回应怎么玩,是不是很尴尬?没回应就自个查资料!哈哈~~。这篇文章就简单聊聊那些不那么理想的情况。就当作复习,内容仅供参考。

首先,一个最基本的问题,两台计算机是怎么进行通信的

假设现在A主机中的向B主机的发一条消息,“今晚约吗”。

首先,A主机需要开机入网,A主机会问路由器“我该设置什么IP地址和子网掩码,默认网关地址是多少”,路由器上的DHCP服务器收到后就分配一个IP地址给主机(DHCP服务分为两个阶段,有的书分为4个阶段,怎么分都不重要,后面会单独讲)。于是打开应用程序,编辑消息,点击发送。

应用层:当点击"发送"的时候,A主机的应用程序就会把发送给谁,端口号,消息内容等等封装成数据包,交给表示层。除此以外,还要知道接收方的IP地址是多少,这里要进行DNS域名解析。(比方说发邮件到目的邮箱,邮件要通过服务器中转,域名解析就是服务器的IP地址。为什么要中转?因为你发送的时候B主机可能是关机的状态,那么B主机自然是没有IP地址的,那服务器就要先保留A发送的邮件,等B主机连接上服务器了,服务器再把邮件发给B主机。)

表示层:表示层收到应用层数据,一看,你这编码格式B主机不一定有啊,万一没有,B就算收到了数据显示出来可能是一堆乱码,于是表示层把数据把数据转换成通用格式,这样B收到后就能准确的知道A发的消息是什么。如果当心别人窃取了消息,还可以对数据进行加密,B收到后再解密。

会话层:接下来数据就来到了会话层,会话层主要是管理何时建立连接,传送顺序,何时关闭连接。比方说登录FTP服务器要进行身份验证,QQ上传送文件,要先建立一个会话,会话结束后关闭会话。

传输层:数据来到传输层,由于是端到端的传输,传输层采用TCP协议,进行三次握手建立连接,准备发送数据,在传输前应用层还要考虑几个问题,
问题1:我应该发送多大的数据包,因为数据经过的网络有的数据链路可承载的最大传输单元(MTU)都不尽相同,我如果不按最小的单元封包发送,数据在传输的过程中可能要先分片再重组。所以我得知道MTU大小
问题2:如果每次都发送一帧,然后等待接收回复确认帧,如果这个确认帧在网络中丢失了或者由于网络拥堵一直没传过来,我又要重发数据,这样一来一往的传送效率就低了,那怎样提高发送效率呢。那我就一次多发几条。发送窗口控制
问题3:我一次多发几条数据接收端能不能接收得过来,如果接收不过来,我后面又要重发数据,那就白折腾了,所以我得知道接收端的实际接收能力。流量控制
问题4:网络是一个共享环境,如果一开始就发送一个较大的包到网络,可能网络 会出现拥堵,为了防止这个问题的出现,所以要还进行拥塞控制
问题5:发送的数据是否到达,如果没有接收端返回的确认收到的消息,过多久进行重发数据,重发控制
传输层为了保证通信质量可靠性要作很多控制,以上的这些问题都是实际网络通信探索中遇到的,后续会一个一个问题单独介绍是怎么解决的。

网络层:网络层的作用就将数据从发送端发送到接收端,使用IP协议。那数据怎么走,先发送给谁,要进行路径的选择。此外还要知道下一段主机/路由器的MAC地址,在实际传输的时候,数据可能不是直接从源主机发送到目标主机,数据会经过交换机,路由器等等,是一段一段传输。具体是怎么一段一段传输,然后怎么得到目标IP地址对应的MAC地址的,我后面再细讲数据在网络中怎么传送的。

数据链路层:数据从上层传到了链路层,首先封装MAC地址。数据链路层只负责一个网络分段内的数据传送。

物理层:终于可以发送数据了,发一个前导码,例如101010,同步一下,然后把0、1转换为高低电压和脉冲光传输给物理的传输介质(就是光纤和双绞线)。

假设现在B主机收到了数据,接收方是自下层到上层逐层解包。

物理层收到数据,数据链路层先校验,检查数据在传输过程中有没有损坏,如果有损坏则丢弃,如果没有损坏,则匹配MAC地址,发现是发我的数据包,那就收下了,上交给IP层,IP层解析出来目标IP地址和本机IP地址相同,再上交给传输层,传输层会返回确认帧,再解析出端口号,上交给端口号对应的应用程序,我不知道这里会话层都干了什么,数据到在表示层进行数据编码转换或者解密等等。最终显示消息。接收肯定不会那么简单,肯定还有I/O中断等处理,接收时7层模型每一层都做了什么,相关资料极少,有了解的朋友欢迎在下方指导。

数据在网络中怎么传送的?
前面我们通过DNS域名解析已经知道了目标IP地址,目标IP地址不一定就是B主机的IP地址,原因我已经说过了,教科书讲的都特别理想。
1、 因此首先主机先从会本机的ARP缓存表中查找对应的MAC地址记录。
2、 如果找不到,主机A根据目标IP地址判断目标主机是不是在本网络。
3、 如果不在本网,那说明要数据通过网关发出去。然后主机从本机的ARP缓存表中查找网关对应的MAC地址记录
4、 如果没有找到就发送ARP广播请求网关MAC地址。
5、 回应后,更新本机ARP缓存表,增加记录[目标主机IP,网关MAC地址]。
6、 下次如果要发送数据给目标主机,直接封装网关的MAC地址。
7、 网关收到数据增加记录[A主机,MAC地址]。查自己的ARP缓存表有没有目标IP对应的MAC地址。
8、 如果找到了直接封装对应的MAC地址发送出去,如果没有找到目标主机的MAC,网关根据目标IP地址找路由表,确定下一跳的IP地址。
9、 网关根据下一跳的IP地址,查找网关的ARP缓存表,如果没找到,继续查找下一跳IP地址对应的MAC地址。记录[下一跳的IP地址, 下一跳的MAC地址]
10、 下一跳收到数据增加记录[网关,MAC地址]。重复7~10数据就这样一段一段的在网络上传递,边查询边更新,直到数据查到目标IP的MAC地址。最终把数据发送给目标主机。

DHCP工作原理
DHCP主要是实现自动设置IP地址,统一管理IP地址分配。
第一阶段:
1、 DHCP客户端广播发现包,发现DHCP服务器,请求IP地址租约。
2、 DHCP服务器收到后预分配一个IP地址,然后发一个ICMP回送请求到网络,确认没有返回应答。再通知客户端可以使用的网络设置。
第二阶段:
3、 DHCP客户端收到DHCP服务器发来的IP地址,广播发送ARP请求包,确认没有返回应答。再给广播DHCP请求包,要求设置2中通知的设置。
4、 DHCP服务器同意3中的设置。
因为网络上可能存在多个DHCP服务器时,一个DHCP服务器不能查出已被其它服务器租出去的IP地址,而且DHCP不能发现网络上非DHCP客户机已经在使用的IP地址。DHCP的确认之所以分两个阶段是为了保证即使在DHCP服务器上重复设置也能正常工作。

ICMP协议
ICMP主要负责与IP相关的设置,IP包被废弃的原因,网络通信等提供这类功能的协议,像平时经常使用的ping命令,traceroute命令都是利用了ICMP的回送应答消息。

DNS
因为IP地址不好记,所以会给主机取一个方便记忆的标识名,于是就有管理主机名与IP地址的对应表,DNS就提供了一个自动检索某主机名的IP地址的系统。叫域名解析,域名是分层的,如果mail.163和mail.qq就是在mail层下的两个不同的域名。DNS就是互联网中的分布式数据库。

ARP的工作机制
ARP主要是通过IP地址查找对应的MAC地址信息。例如A主机想询问B主机的MAC地址。首先可以通过DNS找到B的IP地址。
1、 首先查找本机的ARP缓存表中有没有记录,
2、 如果本机上没有找到记录,就广播发送一个ARP请求包,这个请求包将会被同一链路上的其它主机收到。
3、 只有目标IP的主机收到消息后,目标主机才会通过单播的形响应请求主机,如同一链路上没有目标主机就收不到任何响应。
ARP能穿过两层交换机,但不能穿过路由器。对于两层交换机在收到ARP请求后,首先会增加记录[请求主机IP地址,请求主机的MAC地址],接着找到本机的ARP缓存表中是否有目标IP的MAC地址,如果有则从对应的端口发送出去,如果没有,则从默认端口广播ARP请求。

路径MUT发现工作原理
由于每种数据链路的可承载的最大传输单元可能不同,在传输的过程中IP报文可能要先分片再在目标主机进行数据重组,这样会降低网络传送效率,因此,并不希望路由器做IP数据包的分片处理。所以产生了“路径MUT发现”(Path MTU Discovery)。
1、 发送时IP首部的分片标志位设置为不分片,路由器收到包后会丢弃。
2、 路由器会ICMP通知下一次MTU的大小。
3、 主机收到后,如果是UDP传输,那么后面发送包都会小于等于MTU大小,对于TCP传输,会在发送端传输层就进行分片重发处理。
4、 对于UDP传输,分片到达目标主机后,要重组再传给UDP,但对于TCP传输不需要重组,原样发给TCP层。

窗口控制
TCP以段为单位发送数据,每发一个段都会进行确认应答。如果这样发一个段就等待回复再发下一段数据,效率太低了,为了提高效率,发送端在发送一个段后可以不必要等待确认应答,继续发送。窗口大小就是指无需等待确认应答而可以发送的最大值。如果收到了前面的确认帧那么窗口就向前滑动一段。否则等待确认应答。

流量控制
考虑到接收端的接收能力,控制发送的数据量,就是流量控制,具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,然后发送端调整窗口大小。

拥塞控制
防止网络拥塞,控制窗口大小。

重发控制

三层交换机与路由器的区别
三层交换机和路由器都可以进行路由转发功能,三层交换机的更偏重数据转发功能,路由器偏重不同网络的互联,路由功能更全。

网关与路由器的区别
网关是个概念,能进行协议转换,能让不同的网络进行通信。可以是路由器,也可能用三层交换机做网关。而路由器是指一个具体设备。

数据在网络中的传输(一)相关推荐

  1. 图解数据在网络中的传输过程

    数据在网络中的传输过程 在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的,这是本文探究的重点. 下图是本文中使用的网络拓扑图,数据从客户端发送给服务器端. 客户端各层对数据的封装 ja ...

  2. 读书笔记(随笔2)数据在网络中的传输

    2 数据在网络中的传输 所有的数据对于网络来说都是业务,不同的业务数据对传输的要求不一样, 就需要有不同的 信令协议 来满足它,不同的信令协议对数据的封装和标识提出 了不同的要求,从而又产生了各种 封 ...

  3. 数据在网络中的传输示意图

  4. 数据包在网络中的传输过程详解

    我们当今使用电子设备都离不开网络,通过网络我们可以聊天.玩游戏.看电影都操作. 网络的本质就是交换数据. 本文我们就来看下数据是如何在网络中传输的. 计算机网络模型 现在有两种计算机网络模型,分别为O ...

  5. 浅析网络数据帧在网络中的传输

    文章目录 网络帧的传输 1. 网络的分层 2.网络帧的封装 3. 网络帧的传输 4. 相关疑问 参考材料 网络帧的传输 本文主要简单回顾一下网络数据包的封装.分片.传输以及重新组装的过程,帮助我们理解 ...

  6. 数据在网络中是如何传输的

    更多专业文档请访问 www.itilzj.com 你有想过吗,在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的?中间涉及到了哪些理论? 01 客户端各层对数据的封装 java实现客户端 ...

  7. IP数据包在网络中的传输过程

    1. 获取目的IP 2. 判断源IP与目的IP是否在同一网段   -->   比较 IP & Genmask 是否相同 2.1 若在同一网段,则先查询arp缓存中是否有目的ip的mac地 ...

  8. 数据在网络中的发送和接收过程--简略版(TCP/IP五层结构)

    在应用层上设备A想给IP地址为P的设备B发送信息:(假定已知B的IP) 数据信息从应用层而来,在传输层指定特定的端口号,再将这些数据放到TCP报文或者UDP报文内. 若使用UDP,不论从应用层来的数据 ...

  9. sendfile | 传说中的零拷贝(主要用于网络中文件传输)

    sendfile函数 sendfile函数简介 sendfile简单小例子 用sendfile函数简单模拟文件下载 sendfile函数简介 sendfile函数:sendfile函数是在两个文件描述 ...

最新文章

  1. html 打印时隐藏,html 打印相关操作与实现详解
  2. Enum类的非一般用法汇总(工作中遇到时持续更新)
  3. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列
  4. 自编码AutoEncoder 及PyTorch 实现
  5. Lambda省略格式Lambda使用前提
  6. ZOJ2930 The Worst Schedule(最小割)
  7. SpringBoot连接Redis服务出现DENIED Redis is running in protected mode because protected mode is enabled
  8. Java排序之归并排序
  9. Cocos Creator 编辑器扩展
  10. 基于DEAP库的python进化算法-4.遗传算法求解TSP问题
  11. Bert和一些以Bert为基础的预训练模型的Mask区别
  12. Bresenham直线算法与画圆算法
  13. java mysql图书馆管理系统源码+论文
  14. windows上搭建NFS服务器--haneWIN
  15. 做LeetCode题的感悟 (1-10题)
  16. UVC 摄像头驱动开发
  17. 深入浅出DockerPDF
  18. linux如何自定义桌面,如何自定义 GNOME 3 桌面? | Linux 中国
  19. AI 边缘计算平台 - BeagleBone AI 64 简介
  20. 搭建asp会议签到系统 第三章 会议签到

热门文章

  1. 维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)
  2. GVoice错误码20481
  3. python二进制转十进制不用内置函数_在python中将二进制转换为十进制(没有内置的二进制函数)...
  4. Saltstack 分组管理
  5. 毕业设计| STM32单片机控制的智能家居系统设计
  6. 李乐逸前端的学习内容 HTML篇
  7. 不宜妄自菲薄,引喻失义
  8. Unity四元数和向量相乘作用及其运算规则
  9. html的下拉列表框
  10. FZU 1077 铁皮容器