网络常见问题问答

       为什么多个主机的通讯可以在一条线上同时进行通讯?

如果一个主机一直不停的发送数据,那么是不是别的共享一根线路的主机不是就发送不了数据了呢?(想想我们当年一个宿舍多个同学用集线器的情况)

 

A

首先,以太网是通过时分复用来解决通信信道的共享问题的;

其次,在OSI 的第二层 数据链路层,基于CSMA/CD协议、通过"载波侦听"的方式进行冲突检测 解决在公共通道上以广播方式传送数据中可能出现的问题(主要是数据碰撞问题)

 

在无线局域网环境中,由于网络设备无法做到一边接受数据信号一边传送数据信号,故采取CSMA/CA协议,此时,只有收到网络上返回的ACK信号(注意这个ACK是无线链路层802.11ACK,不是TCPACK)后才确认送出的数据已经正确到达目的地址。

 

 时分复用(TDMTime Division Multiplexing)就是将提供给整个信道传输信息的时间划分成若干时间片(简称时隙),并将这些时隙分配给每一个信号源使用,每一路信号在自己的时隙内独占信道进行数据传输。时分复用技术的特点是时隙事先规划分配好且固定不变,所以有时也叫同步时分复用。其优点是时隙分配固定,便于调节控制,适于数字信息的传输;缺点是当某信号源没有数据传输时,它所对应的信道会出现空闲,而其他繁忙的信道无法占用这个空闲的信道,因此会降低线路的利用率。

 

 

CSMA/CDCarrier Sense Multiple Access/Collision Detect)即载波监听多路访问/冲突检测方法 以太网中,所有的节点共享传输介质。如何保证传输介质有序、高效地为许多节点提供传输服务,就是以太网的介质访问控制协议要解决的问题。

 

CSMA/CD原理比较简单,技术上易实现,网络中各工作站处于平等地位 ,不需集中控制,不提供优先级控制。但在网络负载增大时,发送时间增长,发送效率急剧下降。

 

无线局域网标准802.11MAC802.3协议的MAC非常相似,都是在一个共享媒体之上支持多个用户共享资源,由发送者在发送数据前先进行网络的可用性检测。在802.3协议中,是由一种称为CSMA/CD(Carrier Sense Multiple Access with Collision Detection)的协议来完成调节,这个协议解决了在Ethernet上的各个工作站如何在线缆上进行传输的问题,利用它检测和避免当两个或两个以上的网络设备需要进行数据传送时网络上的冲突。在802.11无线局域网协议中,冲突的检测存在一定的问题,这个问题称为"Near/Far"现象,这是由于要检测冲突,设备必须能够一边接受数据信号一边传送数据信号,而这在无线系统中是无法办到的。

  鉴于这个差异,在802.11中对CSMA/CD进行了一些调整,采用了新的协议CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)或者DCF(Distributed Coordination Function) CSMA/CA利用ACK信号来避免冲突的发生,也就是说,只有当客户端收到网络上返回的ACK信号后才确认送出的数据已经正确到达目的地址。

CSMA/CA协议的工作流程分为两个分别是:

  1.送出数据前,监听媒体状态,等没有人使用媒体,维持一段时间后,再等待一段随机的时间后依然没有人使用,才送出数据。由於每个设备采用的随机时间不同,所以可以减少冲突的机会。

  2.送出数据前,先送一段小小的请求传送报文(RTS : Request to Send)给目标端,等待目标端回应 CTS: Clear to Send 报文后,才开始传送。 利用RTS-CTS握手(handshake)程序,确保接下来传送资料时,不会被碰撞。 同时由於RTS-CTS封包都很小,让传送的无效开销变小。

  CSMA/CA通过这两种方式来提供无线的共享访问,这种显式的ACK机制在处理无线问题时非常有效。然而不管是对于802.11还是802.3来说,这种方式都增加了额外的负担,所以802.11网络和类似的Ethernet网比较总是在性能上稍逊一筹。

 

CSMA/CD CSMA/CA的主要差别

  CSMA/CD:带有冲突检测的载波监听多路访问,可以检测冲突,但无法避免

  CSMA/CA:带有冲突避免的载波侦听多路访问,发送包的同时不能检测到信道上有无冲突,只能尽量避免

  1.两者的传输介质不同,CSMA/CD用于总线式以太网,CSMA/CA则用于无线局域网802.11a/b/g/n等等

  2.检测方式不同,CSMA/CD通过电缆中电压的变化来检测,当数据发生碰撞时,电缆中的电压就会随着发生变化;CSMA/CA采用能量检测(ED)、载波检测(CS)和能量载波混合检测三种检测信道空闲的方式;

  3.WLAN中,对某个节点来说,其刚刚发出的信号强度要远高于来自其他节点的信号强度,也就是说它自己的信号会把其他的信号给覆盖掉;

  4.本节点处有冲突并不意味着在接收节点处就有冲突。

 

 

 

       什么是链路层,交换机如何传送数据包?

链路层是O S I 模型的第二层,有些链路层协议能够提供检错和纠错的功能,用于为上层用户提供可靠的逻辑无差错数据链路,屏蔽物理层比特流产生的丢失、干扰、顺序不正确问题。交换机通过自动学习数据framesource MAC和端口的对应关系来建立MAC和端口的映射表,通过映射表进行frame的转发

 

 

       分界的问题:frame是变长的,如何分开连续的两个frame

 

链路层的帧同步功能用于解决这个问题:

为了使传输中发生差错后只将有错的有限数据进行重发,数据链路层将比特流组合成以帧为单位传送。每个帧除了要传送的数据外,还包括校验码,以使接收方能发现传输中的差错。其中比特填充法和违法编码法目前较为常用;

 

       是否重传的问题:接收到的数据校验有问题,链路层会要求重传吗?

是,链路层可以有差错控制功能,用以使发送方确定接收方是否正确收到了由它发送的数据。通常采用反馈检测和自动重发请求(ARQ)两种基本方法实现。

 

但是现在使用得最多的PPP链路层协议是不使用确认机制和窗口机制的,Ethernet 2协议也是不会进行差错控制和重传的。
另外传输层的TCP协议是端到端(进程到进程)的协议,而数据链路层的HDLC协议则是仅在一段链路上的结点到结点的协议
故而数据链路层的差错控制不能保证端到端的逻辑正确性。

 

 

       建立最小的传输单位frame,还起到什么作用呢?

最大的好处是限制每个发送方每次发送数据的大小,这样才可以做到多个发送方可以公平的共享的使用同一条线路和设备

       多个主机可以共享同一条线路进行通讯:如何区分不同的通讯peer

包头中含有Mac地址的信息,用以区分不同的主机发出的包

这里问得不好,主机已经是四层以上的设备了。所以,这里问的已经不是二层的东西了。Peer是:Source IP:Source Port,Destination IP:Destination Port

 

 数据链路层的最基本的功能是向该层用户提供透明的和可靠的数据传送基本服务。透明性是指该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义;可靠的 传输使用户免去对丢失信息、干扰信息及顺序不正确等的担心。在物理层中这些情况都可能发生,在数据链路层中必须用纠错码来检错与纠错。数据链路层是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一无差错的线路

 

(1)    字节计数法:这是一种以一个特殊字符表示一帧的起始并以一个专门字段来标明帧内字节数的帧同步方法。接收方可以通过对该特殊字符的识别从比特流中区分出帧的起始并从专门字段中获知该帧中随后跟随的数据字节数,从而可确定出帧的终止位置。

(2)    使用字符填充的首尾定界符法:该法用一些特定的字符来定界一帧的起始与终止,为了不使数据信息位中出现的与特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据字符前填充一个转义控制字符(DLE)以示区别,从而达到数据的透明性。兼容性比较差。

(3)    使用比特填充的首尾标志法:该法以一组特定的比特模式(如01111110)来标志一帧的起始与终止。比特填充很容易由硬件来实现,性能优于字符填充方法。

4  违法编码法:该法在物理层采用特定的比特编码方法时采用。例如,一种被称作曼彻斯特编码的方法,是将数据比特“1”编码成高-低电平对,而将数据比特“0”编码成低-高电平对。而高-高电平对和低-低电平对在数据比特中是违法的。可以借用这些违法编码序列来定界帧的起始与终止

 

 

IEEE 802.1p(LAN Layer 2 QoS/CoS Protocol for Traffic Prioritization ) 有关流量优先级LAN第二层QoS/CoS 协议。IEEE 802.1P 规范使得第二层交换机能够提供流量优先级和动态组播过滤服务。优先级规范工作在媒体访问控制(MAC)帧层(OSI参考模型第二层)。该标准也提供了组播流量过滤功能,以确保该流量不超出第二层交换网络范围。802.1P协议头包括一个3位优先级字段,该字段支持将数据包分组为各种流量种类。IEEE极力推荐网络管理员实施这些流量种类,但并不要求强制使用。802.1P流量被简单分类并发送至目的地,而没有带宽预留机制。

 

问题:

交换机是怎样建立端口和MAC的对照关系表的呢?(后面自有分解)

交换机根据接收到的framesource MAC来获知某个MAC跟某个端口的对应关系。当发送目的MAC不在这个映射表里的时候,就往所有其他端口转发(泛洪,flood

 

       什么是IP层,路由器如何传送数据包?

IP层即网络层(Network Layer),是O S I 模型的第三层,其主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。

路由器在转发数据包到下一站时,需要用下一站的MAC地址来封装链路报头 (Link header),它向ARP查询这个地址。如果ARP cache里没有这个地址,路由器的ARP会发送ARP Request去查询。

 

         当你写网络程序,通讯时明明只知道对端的IP地址,并不知道对端的MAC地址,封装到链路层的frame的目的地址是怎么得到的呢?-ARP

      通过地址解析协议(Aress Resolution Protocal),可以将32位的IP地址转换成48位的,

      又及(自己的胡乱猜想):ARP是在同一子网中广播的,故而ARP广播风暴或攻击也是在同一子网中产生灾难性后果的,或许控制影响也是分割子网的设计目的之一吧。

 

         路由匹配算法是怎么进行匹配的?-看看主机的路由表

 

路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制。

 

 

         路由器的路由表是怎么维护的?-全部手工维护,不可能啊?

 

静态路由表需要手工维护、动态路由表根据路由选择协议自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径;(写到这里本人突然一阵恶寒,怕就怕这种不知道什么时候自动修改路径的算法,算法是人写的,在特定情况下是一定会有预料不到的问题的;比如Oracle CBO自动选择执行计划,自动调整SGA的算法什么的,都是在特定环境下酿成惨剧的元凶。故而如何事先分析可能得变化,事后监控这种变化及变化带来的结果,会是很重要的事情,只是不知道网络方面具体是怎么做的)

1静态路由表

  由系统管理员事先设置好固定的路由表称之为静态(static)路由表,一般是在系统安装时就根据网络的配置情况预先设定的,它不会随未来网络结构的改变而改变。

2动态路由表

  动态(Dynamic)路由表是路由器根据网络系统的运行情况而自动调整的路由表。路由器根据路由选择协议Routing Protocol)提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。

  路由器通常依靠所建立及维护的路由表来决定如何转发。路由表能力是指路由表内所容纳路由表项数量的极限。由于Internet上执行BGP协议的路由器通常拥有数十万条路由表项,所以该项目也是路由器能力的重要体现。

 

 

         主机是怎么把IP包发送给网关,通过网关进行转发的??

如果目标主机不在本子网,则需要根据路由表中的信息匹配目标网关,使用目标网关MAC作为目标MAC,发送数据帧;然后由目标网关在目标子网内进行转发。

 

 

       多个网卡主机需要主动通讯时会如何选择通讯网卡和IP

  

1、  如果程序没有绑定通讯的源IP

根据通讯的目的IP和主机路由表进行匹配,找到最大匹配的路由进行转发。如果Match Local路由表则通过对应网卡直接发送。如果Match的是Remote路由,那么通过对应网卡发送给网关转发。选择了网卡,那么IP就是这个网卡上的IP了,对于一个网卡配置了多个IP的情况,一般会选择网卡IP列表的第一个IP

2、  如果程序调用bind绑定了IP

那么就不存在确定source ip的问题了。就是简单的通过主机路由表确定路由发送数据了。如果bind错了IP,会导致送出去的数据包没有响应回来。

       为什么只用IP就可以完成以太网通讯?MAC在哪里起作用呢?

 

Mac地址只在数据链路层起作用,通过路由算法和路由表,网络层就可以使用IP完成以太网通讯;

 

因为TCP需要对数据包进行接收确认,那么发送方是不是每发出一个数据包都需要等待接收到对方确认信息后再发送第二个数据包?

不是,可以连续发送若干个数据包,等待ack,通过滑动窗口协议来控制。

为什么TCP需要慢启动和拥塞控制?

 

TCP发送端采用慢启动和拥塞避免算法来控制向网络输送的数据量。

在不清楚网络环境的情况下向网络传送数据,要求TCP缓慢地探测网络以确定可用带宽,以避免突然传送大量数据而使网络拥塞。

在慢启动期间,拥塞窗口(cwnd)慢慢增长,直到拥塞窗口超过慢启动阀值(ssthresh) 然后停止执行慢启动算法,转入拥塞避免阶段,此时拥塞窗口线性增长,直到检测到拥塞,检测到拥塞后拥塞窗口减半,然后继续转入慢启动,如此往复。

 

拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。为了避免这种灾难性后果,所以TCP需要进行拥塞控制;

 

为什么TCP需要接收窗口通告?

接收端通知窗口(rwnd)是对未完成数据量的接收端的限制,接收端通知窗口cwnd和拥塞窗口rwnd的最小值决定了数据传送量,接收端通知窗口的合理设置可以避免接收端来不及处理接收到的数据。

 

 

如果网络中有多个程序使用UDP在不间断的发送大量数据会发生什么情况呢?

丢包,对端收不到

如果网络中有多个程序使用TCP在不间断的发送大量数据又会发生什么情况呢?跟上述情况有什么区别?

由于tcp是可靠连接,有拥塞控制缓机制,因此在传输层包总是会被送达的,只是慢一点收到;但往往由于带宽不足,传输时间都会超过传输层上层各项应用的timeout值而无法最终送达应用层

 

Q: 若已知相同LanB站点的IP地址,如何确定其MAC地址?

A: 先查找本机ARP缓存,如有B Mac地址则直接发送数据帧,如没有,发送ARP requestlan中广播,B收到后会应答。

 

以连接关闭作为处理事务终止的标记,发送完数据就关闭连接不就可以了吗?——但是性能不好啊?为什么呢?

多次重复连接会占用大量的开销影响性能。

 

那就重复使用一个连接来完成多个事务,读取的数据都是连续不断的,怎么把这些数据分开为一个一个逻辑单元呢?——定长传输?加入分界符的变长传输?在应用协议头加入数据长度标识?

TCP的数据处理方式是以stream方式进行处理的。Stream的意思是数据会源源不断的送过来,不知道哪里是结束。所以长连接的应用必须自己定义一种数据的分界方式。看看HTTPheader里的Content-Length就是起到这个分界作用的。HTTP里还有一个Chunk的传输方式,在每个chunk前都会发送一个chunk大小的数据。

 

问题:连接多就代表可以同时发送更多的数据,但是连接越多传输就会越快?——不是,WHY

如果多线程程序

1, 不存在同步锁之类会导致线程等待的情况,

2, TCP/IP OS层没有达到连接数限制,

3, 线程之间不需要交互数据

4, CPU 内存网卡流量等底层资源达到限制值之前,

则线程数越多,效率越高。

所以在内网应用网络RTT不高的大部分场景之下,似乎永不上多线程。

 

       为什么单个TCP连接和多个TCP连接的传输速度会不一样?

单连接最大传输速度=最大发送窗口大小/RTT,故而理论上单连接应用不可能使数据包布满线路而完全利用带宽(因为RTT虽小但总是存在的),多连接应用理论上可以比单连接应用更加少的受到RTT的影响而更好的利用带宽----如果不考虑前述的一些限制的话(在上行下行带宽不一致、或者广域网环境RTT较大且不稳定的情况下,如ADSL应用中连接多个服务端下载这种应用,多线程利用带宽更好的优势明显)

RTTRound Trip Time):两倍网络延时

 

       为什么网络丢包会影响TCP传输的速度?

因为会触发拥塞控制逻辑,导致拥塞窗口减半,就是发送窗口减半。

 

       为什么TCP数据发送方的发送速度会受到接收方的影响?

因为接受方如果来不及处理而丢弃了一些包,发送方就会收不到ack,等待超时后就会重发这些包

 

       为什么我们编程经常使用TCP,却很少使用UDP

因为要保证数据送达对端的应用层

       什么才是网络问题?conntection refuseconnection resetconnect timeoutread timeoutwrite timeout

No route to host:路由器上找不到匹配通讯目标的路由,返回ICMP通知通讯发起方

其实最大可能是对端主机down

Connection reset by peer:通讯对端出现通讯异常、防火墙发出RST数据包、通讯对端backlog满, HTTP应用的话,最大可能是用户在传输进行中强行关闭IE或者按了停止键(很多时候reset是因为程序质量问题,很多人并不知道关闭TCP链接什么时候会触发reset。当接收buffer还有数据的时候就close连接会reset;还有是在发送buffer还有数据调用shutdown2)也会触发reset

Connection timed out:网络拥塞、防火墙阻拦导致连接无法建立,ServerOS hang也会导致这个问题,

Connection refused:通讯对端对应的TCP端口没有打开,最大的可能是对端主机正常而服务没有启动之类

Read timeout:接收数据阻塞超时,大部分是程序问题,对端应用慢没有及时处理完导致time out

Write timeout:发送buffer满,write阻塞超时,大部分是程序问题,对端应用慢没有及时处理完导致time out

总之,应用产生问题的概率》主机产生问题》网络、防火墙产生问题;如果是socket应用,产生问题的概率会更高;

 

       真正的网络问题是什么?

公司内常见的有网络设备和防火墙效率问题啊,丢包啊,带宽瓶颈啊,环路啊什么的;没做过网络,不敢瞎掰,以后慢慢观察咯

       常见的网络编程API和网络编程误区有哪些?

其实就是没有考虑到上述特性写程序的一些错误咯,不过在目前公司Pafa标准架构下(或者说是使用中间件的应用,都包装了sokect的特性),需要程序员控制的网络编程部分就没有多少了。

你可能感兴趣的:(技术)