高效面试之计算机网络常考点


1. 电路交换与分组交换的区别?优劣对比。

2. OSI有哪几层,会画出来,知道主要几层的各自作用。

应用层 与用户应用进程的接口
表示层 数据格式的转换
会话层 会话管理与数据传输的同步
传输层 端到端经网络透明地传送报文
网络层 分组传送,路由选择
数据链路层 在链路上无差错地传送帧
物理层 经物理媒体透明传送比特流

3. TCP/IP有哪几层,会画出来,知道所有层数的作用,会列举各层主要的协议名称。
传输层协议:
TCP将数据分成数据报,用能够到达目的地的路径信息连行包装,接收端则将这些数据进行重组。它提供可靠的、面向连接的数据报传递服务。
TCP协议位于IP协议的上层,为 数据提供 错误校验流量控制序列信息用以补充 IP协议的不足



UDP 是无连接的服务, 优点是灵活方便和比较迅速,但不能防止报文的丢失、重复或失序,特别适合于传送少量零星的报文。比如DNS就是基于UDP

网络层协议:

IP协议
主要负责在主机之间寻址和选择数据包的路由。IP具有全网的寻址能力。 IP协议不含错误恢复的编码,属于不可靠的协议。这是 说, IP协议没有提供一种数据未传达以后的处理机制.




地址解析协议 ARP
在现行寻址机制中,主机的以 太网 网卡只能识别MAC地址,而不能识别IP地址,若数据帧中不指明主机B的MAC 地址,主机B的网卡不能识别该帧是发给自己的,因此主机A仅知道主机B的IP地址还不够,还必须知道主机B的MAC地址,才能完成对主机B的访问; 网络之间是用IP地址寻址网络之内(同一物理网段或称IP子网)是用MAC地址寻址。,所以需要使用地址解析协议。

ARP 是一个广播协议 —— 网络上的每一台机器都能收到请求。每一台机器都检查请求的 IP 和自己的地址,符合要求的主机回答请求。
ARP request 广播包 ARP reply 包  ARPcache表,arp -a查看ARP缓存表内容
ARP (地址解析)协议是一种解析协议,本来主机是完全不知道这个 IP 对应的是哪个主机的哪个接口,当主机要发送一个 IP 包的时候,会首先查一下自 己的 ARP高速缓存 (就是一个 IP-MAC 地址对应表缓存),如果查询的 IP MAC 值对不存在,那么主机就向网络发送一个 ARP 协议 广播包 ,这个广播包 里面就有待查询的 IP 地址,而直接收到这份广播的包的所有主机都会查询自己的 IP 地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个 reply包  含自己的 MAC 地址的 ARP 包传送给发送 ARP 广播的主机,而广播主机拿到 ARP 包后会更新自己的 ARP 缓存(就是存放 IP-MAC 对应表的地方)。发送 广播的主机就会用新的 ARP 缓存数据准备好数据链路层的的数据包发送工作
源主机A与目的主机B位于不同物理网段,以后主机A发往主机B的数据帧用的是主机B的IP地址和路由器的MAC地址

ARP欺骗
ARP请求为 广播 形式发送的,网络上的主机可以自主发送ARP应答消息,并且当其他主机收到应答 报文 时不会检测该报文的真实性就将其记录在本地的 MAC地址 转换表,这样攻击者就可以向目标主机发送伪ARP应答报文,从而篡改本地的MAC地址表。   ARP欺骗可以导致目标计算机与 网关 通信失败,更会导致通信 重定向 ,所有的数据都会通过攻击者的机器,因此存在极大的安全隐患。

  ARP欺骗的防御
    1. 不要把你的网络安全信任关系建立在ip地址的基础上或硬件mac地址基础上,(rarp同样存在欺骗的问题),理想的关系应该建立在ip+mac基础上。
    2. 设置 静态的mac-->ip对应表,不要让主机刷新你设定好的转换表。
    3. 除非很有必要,否则停止使用ARP,将ARP做为永久条目保存在对应表中。 在linux下可以用ifconfig -arp可以使网卡驱动程序停止使用ARP。
    4. 使用代理网关发送外出的通讯。
    5. 修改系统拒收ICMP重定向报文

ICMP协议
ICMP 用来传送一些关于网络和主机的控制信息。如目标主机不可到达、路由重定向等。常用的 ping 命令就是使用了 ICMP 协议

Traceroute 的原理是非常非常的有意思,首先给目的 主机发送一个TTL=1 (还记得 TTL 是什么吗?)的ICMP数据包,而经过的第一个路由器收到这个数据包以后,就自动把 TTL 1 ,而 TTL 变为 0 以后,路由器就把这个包给抛弃了,并同时产生 一个 主机不可达的 ICMP 数据报 给主机。主机收到这个数据报以后再发一个 TTL=2 的数据报给目的主机,然后刺激第二个路由器给主机发 ICMP 数据 报。如此往复直到到达目的主机。这样, traceroute 就拿到了所有的路由器 ip

数据链路层协议
SLIP,ppp

4. 硬件(MAC)地址的概念及作用。
MAC地址则是48位的,6个字节.前3字节08:00:20代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3位16进制数0A:8C:6D代表该制造商所制造的某个网络产品(如网卡)的系列号。
如果一个IP主机从一个网络移到另一个网络,可以给它一个新的IP地址,而无须换一个新的网卡。
无论是局域网,还是广域网中的计算机之间的通信,最终都表现为将数据包从某种形式的链路上的初始节点出发,从一个节点传递到另一个节点,最终传送到目的节点。数据包在这些节点之间的移动都是由ARP负责将IP地址映射到MAC地址上来完成的。

5. ARP协议的用途 及算法、在哪一层上会使用arp ?
以太网设备并不识别32位IP地址:它们是以48位以太网地址传输以太网数据包的。因此,IP驱动器必须把IP目的地址转换成以太网网目的地址。在这两种地址之间存在着某种静态的或算法的映射,常常需要查看一张表。地址解析协议(Address Resolution Protocol,ARP)就是用来确定这些映象的协议。 


6. CRC冗余校验算法,反码和检验算法。
循环冗余校验码,是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性

7. 如何实现透明传输。
所进即所出
透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络,不管传输的业务如何,我只负责将需要传送的业务传送到目的节点,同时 保证传输的质量即可,而不对传输的业务进行处理, 所采用的设备只是起一个通道作用,把要传输的内容完好的传到对方。
透明传输不用关心下层协议的传输。
0比特插入法”对数据实现透明传输 
ppp帧起始标志为01111110 ,包含连续6个1,为了避免信息位中出现连续6个1。发送端连续发送5个1,则插入一个0

8. 知道各个层使用的是哪个数据交换设备。(交换机、路由器、网关)

9. 路由表的内容。
路由表建立的主要目标是为了实现路由协议和静态路由选择
route print  就可以查看路由表  

interface 数据包出口ip,若是主机,则为主机网卡地址,本地环路除外。

gateway 下一跳路由器入口的ip
  
缺省路由:0.0.0.0  当我接收到一个数据包的目的网段不在路由记录中,我会将该数据包通过这个接口发送 
本地环路: 127.0.0.1
直联网段的路由记录 :192.168.1.0
本地主机路由: 192.168.1.104
本地广播路由:192.168.1 .255
组播路由  :224.0.0.*组播地址
广播路由: 255.255.255.255
单播:实现点对点网络连接;广播:网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。  组播解决了单播和广播方式效率低的问题。当网络中的某些用户需求特定信息时, 组播 源仅发送一次信息
 
10. 分组转发算法。

11. IP报文的格式,格式的各个字段的含义要理解。

版本(4bit):标示了数据包的IP版本号(IPV4-0100,IPV6-0110);
头部长度(4bit):标识了IP包头的长度,最小长度为20个字节,最大长度为60个字节;
服务类型(8bit):用来指定特殊数据包的处理,分为2个字段:优先权和TOS。
总长度(16bit):IP数据包的总长度,最大长度为65535个字节;
标识符(16bit):通常与标记字段和分段偏移字段一起用于数据包的分段。 如果数据包原始长度超过MTU,那么必须将数据包进行分段处理,路由器在每片数据包的 标识字段打上相同的标记,以便接收设备能够识别出 属于同一个数据包
标志字段(3bit):第一位保留;第二位为DF位,DF设置为1时表示该数据包不允许进行分段处理;第三位是MF位,MF位设置为0时表示为数据包的最后一个分段;
分段偏移(13bit):用于指明 分段起始点相对于IP包头起始点的 偏移量
TTL(8bit):在最初创建数据包时TTL被设置一特定值(1-255),TTL值沿路由器逐跳减一,TTL为0 时丢弃该数据包;
协议(8bit):给出了主机到主机层或传输层的“地址”或协议号;
头部校验(16bit):略
源地址(32bit):略
目标地址(32bit):略

源端口(16bit):
目标端口(16bit):
序列号(32bit):确定了发送方发送的数据流中的数据所在的位置;
确认号(32bit):发送的确认号等于对方下一个报文的第一个字节的序列号;
首部长度(4bit):TCP包头的长度;
URG(1bit):URG置1 ,表明为紧急数据,将该数据插入到数据的最前面;
ACK(1bit):
PSH(1bit):
RST(1bit):释放当前连接并重新建立连接;
SYN(1bit):请求建立连接;
FIN(1bit):终止连接;
窗口大小(16bit):窗口值作为接收方让发送方设置其发送窗口的依据;



类型(8bit):
代码(8bit):
检验和(16bit):

12.MTU的概念,啥叫路径MTU? MTU发现机制,TraceRoute(了解)。

由于以太网 EthernetII 最大的数据帧是 1518Bytes ,除去以太网帧的帧头( DMAC 目的 MAC 地址 48bit=6Bytes+SMAC MAC 地址 48bit=6Bytes+Type 2bytes 14Bytes 帧尾 CRC校验部分 4Bytes  (这个部份有时候大家也把它叫做 FCS ),那么剩下承载上层协议的地方也就是 Data 域最大就只能有 1500Bytes ,这个值我们就把它称之为 MTU 。在2个主机之间当前路径上的任何最小的MTU链接被称为路径MTU
 
13.RIP协议的概念及算法。

14.ICMP协议的主要功能。

15.组播和广播的概念,IGMP的用途。(环回地址、广播地址)

IGMP:Internet组管理协议,一个组播协议
单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?


1.单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用 “点对点通信”(Point to Point)代替“单播 ”,因为“单播”一般与“多播”和“广播”相对应使用。


2.多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。   IP网络的多播一般通过多播IP地址来实现。 多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址 。Windows 2000中的DHCP管理器支持多播IP地址的自动分配。 


3.广播:“广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。拿开会打一个比方吧,在会场上只能有一个人发言,想象一下如果所有的人同时都用麦克风发言,那会场上就会乱成一锅粥。集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。   广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中,一般进行子网划分,就像将一个大厅用墙壁隔离成许多小厅一样,以达到隔离广播风暴的目的。   在IP网络中,广播地址用IP地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。

=================================================================

当前的网络中有三种通讯模式:单播、广播、组播,其中的组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景。

1.单播:
主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用单播模式,具体的说就是IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。
单播的优点:
1)服务器及时响应客户机的请求
2)服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。

单播的缺点:
1)服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。
2)现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞。而将主干扩展20倍几乎是不可能。

2.广播:
主机之间一对所有的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
广播的优点:
1)网络设备简单,维护简单,布网成本低廉
2)由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。

广播的缺点:
1)无法针对每个客户的要求和时间及时提供个性化服务。
2)网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
3)广播禁止允许在Internet宽带网上传输。

3.组播:
主机之间一对一组的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
组播的优点:
1)需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。
2)由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个组播,所以其提供的服务可以非常丰富。 
3)此协议和单播协议一样允许在Internet宽带网上传输。

组播的缺点:
1)与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。
2)现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中


16.Ping协议的实现原理,ping 命令格式。

17. 子网划分的概念,子网掩码。

划分目的
1.节约IP地址,避免浪费。
2.限定广播的传播。
3.保证网络的安全。
4.有助于覆盖大型地理区域
划分方法
1可按子网划分,也可按组机数目划分
例:
对B类网络135.41.0.0/16需要划分为20个能容纳200台主机的网络(即:子网)。2的4次方<20<2的5次方,所以,子网位只须占用5位主机位就可划分成32个子网,可以满足划分成20个子网的要求。B类网络的默认子网掩码是255.255.0.0,转换为二进制为11111111.11111111.00000000.00000000。现在子网又占用了5位主机位,根据子网掩码的定义,划分子网后的子网掩码应该为11111111.11111111.11111000.00000000, 转换为十进制应该为255.255.248.0

128<200<256,即2^7<200<2^8,也就是说,在B类网络的16位主机位中,保留8位主机位,其它的16-8=8位当成子网位,可以将B类网络135. 41.0.0划分成256(2^8)个能容纳256-1-1=254台(去掉全0全1情况)主机的子网。此时的子网掩码为11111111.11111111.11111111.00000000,转换为十进制为 255.255.255.0。 
18. IP地址的分类,如何划分的,及会计算各类地址支持的主机数。
  
主机数-2 全0对应当前主机  全1广播

A类IP地址 地址范围1.0.0.1-126.255.255.254

B类IP地址地址范围128.1.0.1-191.254.255.254

C类IP地址范围192.0.1.1-223.255.254.25

D类IP组播
E类将来使用


以下列出留用的内部私有地址

A类 10.0.0.0--10.255.255.255

B类 172.16.0.0--172.31.255.255

C类 192.168.0.0--192.168.255.255


19.DNS的概念,用途,DNS查询的实现算法。


23.TCP通过哪些措施,保证传输可靠?
TCP通过下列方式来提供可靠性:
1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。 (将数据截断为 合理的长度 )

2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。 ( 超时重发 )

3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 。 ( 对于收到的请求,给出确认响应 )

(之所以推迟,可能是要对包做完整校验)

4、 TCP将保持它首部和数据的 检验和 。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。 ( 校验出包有错,丢弃报文段 不给出响应 ,TCP发送数据端,超时时会重发数据)

5、既然TCP报文段作为IP数据报来传输,而 IP数据报的到达可能会失序 ,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

(对失序数据进行重新排序 ,然后才交给应用层)

6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

(对于重复数据,能够 丢弃重复数据 )

7、TCP还能提供流量控制。TCP连接的每一方都有 固定大小的缓冲空间 。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。 

(TCP可以进行 流量控制 ,防止较快主机致使较慢主机的缓冲区溢出)

TCP使用的流量控制协议是可变大小的滑动窗口协议。


字节流服务::

  两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。


TCP对字节流的内容不作任何解释::

TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

 
   24. 三次握手,四次断开过程。 
  

25. TIME_WAIT状态的概念及意义
TCP状态转换图

注:主动、被动 与 服务器、客户端没有明确的对应关系。
这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻 的认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,以及 关闭连接的四次握手过程。

1、建立连接协议(三次握手)
(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
2、连接终止协议(四次握手)
   由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
 (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
 (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
 (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
 (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
CLOSED: 这个没什么好说的了,表示初始状态
LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状 态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED:这个容易理解了,表示连接已经建立了。
FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
最后有2个问题的回答,我自己分析后的结论(不一定保证100%正确)
1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这 是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一 个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未 必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。
2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为: 虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文


26.滑动窗口协议 与停止等待协议的区别。
滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输 

发送窗口和接收窗口的大小都等于 1时,就是停止等待协议
停止等待协议(stop and wait)  最基础的 数据链路层 协议,在通信时,当收方收到一个正确的数据帧后,便会向发送方发送一个确认帧ACK,表示发送的数据正确接收。当发送方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制.
 
27. TCP的流量控制和拥塞控制实现原理(会画拥塞控制的典型图)。

1.为什么出现滑动窗口?
TCP协议在工作时,如果发送端的TCP协议软件每传输一个数据分组后,必须等待接收端的确认才能够发送下一个分组,由于网络传输的时延,将有大量时间被用于等待确认,导致传输效率低下。为此TCP在进行数据传输时使用了滑动窗口机制。依靠滑动窗口机制 解决传输效率和流量控制问题
2.什么是滑动窗口?
TCP滑动窗口用来暂存两台计算机间要传送的数据分组。每台运行TCP协议的计算机 有两个滑动窗口:一个用于数据发送,另一个用于数据接收。发送端待发数据分组在缓冲区排队等待送出。被滑动窗口框入的分组,是 可以在未收到接收确认的情况下最多 送出的部分。滑动窗口左端标志X的分组,是已经被接收端确认收到的分组。随着新的确认到来,窗口不断向右滑动。

通俗的理解,窗的下面是连续的一些列分组,发送窗口的尺寸就是准备好了可以发送的分组的数量。窗口左端标志最新收到ACK的分组,窗口 左端标志收到ACK的分组,窗口 右端标志在这左边的都 可以发送出去
传完或者接受一个分组后,就向右一下。

3.socket缓冲区和滑动窗口的关系是什么?

一、 TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数
二、对于server端的socket一定要在listen之间设置缓冲区大小,因为,accept时新产生的socket会继承监听socket的缓冲区大小。对于client端的socket一定要在connet之前设置缓冲区大小,因为connet时需要进行 三次握手过程,会通知对方自己的窗口大小。在connet之后再设置缓冲区,已经没有什么意义。
三、由于缓冲区大小在TCP头部只有16位来表示,所以它的最大值是65536,但是对于一些情况来说需要使用更大的滑动窗口,这时候就要使用扩展的滑动窗口,如光纤高速通信网络,或者是卫星长连接网络,需要窗口尽可能的大。这时会使用扩展的32位的滑动窗口大小。
四、滑动窗口听移动规则:
1、窗口合拢:在收到对端数据后,自己确认了数据的正确性,这些数据会被存储到缓冲区,等待应用程序获取。但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK,又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢,缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号,一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次。
2、窗口张开:窗口收缩后,应用进程一旦从缓冲区中取出数据,TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张,实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区。在窗口进行扩张后,需要使用ACK通知对端,这时候ACK的序号依然是上次确认收到包的序号。
3、窗口收缩,窗口的右边缘向左滑动,称为窗口收缩,Host Requirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理。

流量控制:
流量控制方面主要有两个要点需要掌握。一是TCP利 用滑动窗口 实现流量控制的机制;二是如何考虑流量控制中的传输效率。
  所谓流量控制,主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是 返回的ACK中会包含自己的 接收窗口 的大小,并且利用大小来控制发送方的数据发送

拥塞控制:
当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是 防止过多的数据注入到网络中 ,这样可以使网络中的路由器或 链路不致过载
慢启动和拥塞避免是属于TCP发送方必须(MUST)要实现的, 防止TCP发送方向网络传入大量的突发数据造成网络阻塞

拥塞窗口(congestion window,cwnd),是指 发送方在接收到对方的ACK确认前向 允许网络发送的数据量,数据发送后,拥塞窗口缩小;接收到对方的ACK后,拥塞窗口相应增加,拥塞窗口越大,可发送的数据量越大。 拥塞窗口初始值的RFC2581中被规定为不超过发送方 MSS的两倍,而且不能超过两个TCP包,在RFC3390中更新了初始窗口大小的设置方法。

通告窗口(advertised window,rwnd),是指 接收方能接收的没来得及发ACK确认的数据量,接收方数据接收后,通告窗口缩小; 发送ACK后,通告窗口相应扩大

慢启动阈值 (slow start threshold, ssthresh),用来判断是否要使用慢启动或拥塞避免算法来控制流量的一个参数,也是随通信过程不断变化的。

当cwnd < ssthresh时,拥塞窗口值已经比较小了,表示未经确认的数据量增大,需要启动 慢启动算法 ;当cwnd > ssthresh时,可发送数据量大,需要启动 拥塞避免算法。

拥塞窗口cwnd是根据发送的数据量自动减小的,但扩大就需要根据对方的接收情况进行扩大,慢启动和拥塞避免算法都是描述如何扩大该值的。

在启动慢启动算法时,TCP发送方接收到对方的ACK后拥塞窗口最多每次增加一个发送方MSS字节的数值,当拥塞窗口超过sshresh后或观察到拥塞才停止算法。

启动拥塞避免算法时,拥塞窗口在一个连接往返时间RTT内增加一个最大TCP包长度的量,一般实现时用以下公式计算:
      cwnd += max(SMSS*SMSS/cwnd, 1)            (2.1)
SMSS为发送方MSS。

TCP发送方检测到数据包丢失时,需要调整ssthresh,一般按下面公式计算:
      ssthresh = max (FlightSize / 2, 2*SMSS)    (2.2)
其中FlightSize表示已经发送但还没有被确认的数据量。

慢启动

   当启动一个新的连接或者在拥塞后重新发送报文段时,以一个报文段作为拥塞窗的初始值,以后每次收到一个确认之后,将拥塞窗口增加一倍

拥塞避免

   在慢启动技术的基础上,增加一个拥塞窗口的增加条件。当拥塞窗口的大小达到上次拥塞是窗口大小的一半时,以后窗口中所有的报文段都确认后,窗口大小增加1,而不是1倍

加速递减

    一旦发现丢失报文段,立即将拥塞窗口的大小减半,直到窗口大小为1。对于保留在发送窗口中的报文段,其超时定时器的时限增加1倍。


28.TCP的快速重传与快速恢复算法。
 快速重传(fast retransmit)和快速恢复(fast recovery)
TCP接收方收到错序的TCP包时要发送复制的ACK包回应,提示发送方可能出现网络丢包; 发送方收到连续 3个重复的ACK包后启动快速重传算法,根据确认号快速重传那个可能丢失的包而不必等重传定时器超时后再重传,普通的重传是要等到重传定时器超时还没收到ACK才进行的。这个算法是TCP发送方应该(SHOULD)实现的,不是必须。 TCP发送方进行了快速重传后进入快速恢复阶段,直到没再接收重复的ACK包。

快速重传和快速恢复具体过程为:
1. 当收到第3个重复的ACK包时,ssthreh值按公式2.2重新设置;
2. 重传丢失的包后,将拥塞窗口cwnd设置为sshresh+3*SMSS,人工扩大了拥塞窗口;
3. 对于每个接收到的重复的ACK包,cwnd相应增加SMSS,扩大拥塞窗口;
4. 如果新的拥塞窗口cwnd值和接收方的通告窗口值允许的话,可以继续发新包;
5. 当收到下一个ACK确认了新数据时,将cwnd大小调整为sshresh,减少窗口;对接收方
   来说,接收到重发的TCP包后就要发此ACK确认当前接收的数据。

29.TFTP 与 FTP的区别。
TFTP使用UDP/IP协议,它是一种不可靠的传输方法。FTP使用TCP/IP协议,它是可靠的传输方法
 
30.阻塞方式和非阻塞方式,阻塞connect与非阻塞connect。(比较难,有兴趣可以了解)

 IO操作中涉及的2个主要对象为程序进程、系统内核。以读操作为例,当一个IO读操作发生时,通常经历两个步骤:

  1,等待数据准备

  2,将数据从系统内核拷贝到操作进程中

  例如,在socket上的读操作,步骤1会等到网络数据包到达,到达后会拷贝到系统内核的缓冲区;步骤2会将数据包从内核缓冲区拷贝到程序进程的缓冲区中。

阻塞(blocking)与非阻塞(non-blocking)IO

  IO的阻塞、非阻塞主要表现在一个IO操作过程中,如果有些操作很慢,比如读操作时需要准备数据,那么当前IO进程是否等待操作完成,还是得知暂时不能操作后先去做别的事情?一直等待下去,什么事也不做直到完成,这就是阻塞。抽空做些别的事情,这是非阻塞。

  非阻塞IO会在发出IO请求后立即得到回应,即使数据包没有准备好,也会返回一个错误标识,使得操作进程不会阻塞在那里。操作进程会通过多次请求的方式直到数据准备好,返回成功的标识

31. HTTP基本格式。(java程序员必须掌握)

1.http请求
   请求消息由3个部分组成, 请求行、请求头域、请求体
   (1)请求行
    请求行以一个方法开头,空格分开,后面跟着URI和协议的版本,再接上CRLF(回车换行,只允许这个组合在末尾出现)   
    GET /form.html HTTP/1.1(CRLF)
 请求的方法:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT保留将来使用
OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求   
(2)请求头
         后面统一讲
2.http响应
响应消息也由3个部分组成, 状态行、响应头域、响应体
(1)状态行
协议版本 状态码 状态码的描述 回车换行
HTTP/1.1 200 OK(CRLF)
状态码由三位数字组成,第一位表示响应的类型,且有5中类型
1:提示信息--请求已收到,继续处理
2:成功信息--表示消息已被成功接收、理解、接受
3:重定向--要完成请求,需进一步的操作
4:客服端错误--请求有语法错误或者无法实现
5:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 BadRequest //客户端请求 有语法错误,不能被服务器所理解
401 Unauthorized //请求 未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是 拒绝提供服务
404 Not Found //请求 资源不存在,eg:输入了错误的URL
500 Internal Server Error//服务器发生 不可预期的错误
503 Server Unavailable //服务器当前 不能处理客户端的请求,一段时间后,可能恢复正常

慢启动和拥塞避免

⑴ 在刚建立连接时, 拥塞窗口为一个 segment 大小,门限值为 65535 bytes。
TCP 不会送超过拥塞窗口和通告窗口中较小的一个。
⑵ 当拥塞发生时(timeout 或收到重复的 ACK),门限值会变成当前窗口大小
的一半。此外,如果拥塞是因为 timeout 的话,拥塞窗口会设成一个 segment,
也就变成慢启动。
⑶ 每当收到一个 ACK,就增加拥塞窗口,可是到底增加多少要看现在是慢启
动还是拥塞避免。当拥塞窗口小于门限值时,是慢启动,反之则是拥塞避免。
⑷ 在拥塞避免时,每当收到一个 ACK,cwnd 增加 1/cwnd。所以 慢启动是呈
指数 成长,而 拥塞避免是呈 线性 成长
拥塞窗口的大小远小于发送窗口,它实际上是一个MSS。每收到一个ACK,拥塞窗口扩大一个MSS大小,当然,拥塞窗口最大只能到对方通告的接收窗口大小。当然,为了避免指数式增长,拥塞窗口大小的增长会更慢一些,是线性的平滑的增长过程。

快速重传和快速恢复

当 TCP 收到一个顺序错误的报文段时,它必须立刻送出一个重复的 ACK
告诉传送方它所等待的报文段序号。因为我们并不知道这个重复的 ACK 是因为
报文段遗失,或只是到达顺序的不同所引起,所以必须继续等待其它的 ACK。
但是,假如收到 三个以上重复的 ACK,表示非常有可能发生拥塞而导致数据包
的丢失,这个时候 立刻重送这个报文段,而不必等到 RTO,这就是快速重传算
法。 接着跳过慢启动,而直接进行拥塞避免,这就是快速恢复
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值