计算机网络知识点汇总(通过遇到的面试题_不断更新中)


2015年研发腾讯笔试题:典型的路由选择方式有两种,静态路由和动态路由。以下描述正确的是()

A. 当动态路由与静态路由发证冲突时,以静态路由为准

B. 当动态路由与静态路由发证冲突时,以动态路由为准

C. 静态路由适用于网络规模大、网络拓扑复杂的网络

D. 动态路由适用于网络规模大、网络拓扑复杂的网络

参考答案:

静态路由
  是在路由器中设置的固定的路由表。除非网络管理员干预,否则静态路由不会发生变化由于静态路由不能对网络的改变作出反映,一般用于网络规模不大、拓扑结构固定的网络中。静态路由的优点是简单、高效、可靠。在所有的路由中,静态路由优先级最高。当动态路由与静态路由发生冲突时,以静态路由为准

动态路由
  是网络中的路由器之间相互通信,传递路由信息,利用收到的路由信息更新路由器表的过程。它能实时地适应网络结构的变化。如果路由更新信息表明发生了网络变化,路由选择软件就会重新计算路由,并发出新的路由更新信息。这些信息通过各个网络,引起各路由器重新启动其路由算法,并更新各自的路由表以动态地反映网络拓扑变化。动态路由适用于网络规模大、网络拓扑复杂的网络

参考网址: http://blog.csdn.net/bxyill/article/details/8079636

2015年研发腾讯笔试题:TCP报文首部信息中与关闭连接有关的是()

A.URG B.ACK C. SYN D.FIN

参考文献:

TCP初始化连接三次握手吧:发SYN包,然后返回SYN/ACK包,再发ACK包,连接正式建立。但是这里有点出入,当请求者收到SYS /ACK包后,就开始建立连接了,而被请求者第三次握手结束后才建立连接。但是大家明白关闭连接的工作原理吗?关闭连接要四次握手:发FIN包,ACK 包,FIN包,ACK包,四次握手!!为什么呢,因为TCP连接是全双工,我关了你的连接,并不等于你关了我的连接。

客户端TCP状态迁移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态迁移:
CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

现设客户端主动断开连接,流程如下

 

如上图所示,

Client                            消息                                    Server

         close()
------ FIN ------->
FIN_WAIT1                                                         CLOSE_WAIT
<----- ACK -------
FIN_WAIT2 
close()
<------ FIN ------                     
TIME_WAIT                                                       LAST_ACK      

                                      ------ ACK -------> 
CLOSED
CLOSED

参考网址: http://blog.chinaunix.net/uid-25018796-id-94900.html

TCP关闭全状态记录

 关闭时状态转变:

client:  Fin_wait_1 -> Fin_wait_2 -> Time_wait -> closed

server:Close_wait -> Last_ack -> closed

Fin_wait_1 发生在client 发出Fin包后, 并等待server ack .

Fin_wait_2 发生在client收到ack包后, 并等待server发出Fin包时.

Time_wait 发生在client收到Fin包并发出ack包后, 在等待2msl的时间时.

Close_wait 发生在server收到clientfin包并且发出ack包后以及自己主动关闭发出fin包前.

Last_ack发生在server发出fin包后, 并等待clientack.

经常出现的状态组合:

  • client: fin_wait_2;  server: close_wait

原因: client close,但是server忘记close的时候, server在收到clientfin后并没有发送fin包给client, 导致自己处于close_wait状态client在等待serverfin,处于fin_wait_2状态.

  •  client:time_wait; server: closed

原因: client, serverclose, client必须处于time_wait状态等待2msl时间. 于是如果server是处于高并发短连接的状态, 就会有大量的time_wait的连接霸占着. 使得其他的连接连接不了. 

解决方法: linger强制关闭可以解决此问题(rst代替fin),但是linger会导致数据丢失,linger值为0时是强制关闭,无论并发多少多能正常连接上,如果非0会发生部分连接不上的情况!可调用setsockopt设置套接字的linger延时标志,同时将延时时间设置为0
TCP/IP
RFC文档。TIME_WAITTCP连接断开时必定会出现的状态。
是无法避免掉的,这是TCP协议实现的一部分。
WINDOWS下,可以修改注册表让这个时间变短一些
time_wait
的时间为2msl,默认为4min.
你可以通过改变这个变量:
TcpTimedWaitDelay 
把它缩短到30s

PS: Linux 查看 tcp 状态的命令 netstat -an |grep portnumber

Linux close()shutdown()的区别.

   Linux的版本是kernel-2.6.21
    1
,只要TCP栈的读缓冲里更有未读取(read)数据,则调用close时会直接向对端发送RST
    2
shutdownsocket描述符没有关系,即使调用shutdown(fd, SHUT_RDWR)也不会关闭fd,最终还需close(fd)
    3
,能认为shutdown(fd, SHUT_RD)是空操作,因为shutdown后还能继续从该socket读取数据,这点也许还需要进一步证实
    4
,在已发送FIN包后writesocket描述符会引发EPIPE/SIGPIPE
    5
,当有多个socket描述符指向同一socket对象时,调用close时首先会递减该对象的引用计数,计数为0时才会发送FIN包结束TCP连接。shutdown不同,只要以SHUT_WR/SHUT_RDWR方式调用即发送FIN包。
    6
SO_LINGERclose,当SO_LINGER选项开启但超时值为0时,调用close直接发送RST(这样能避免进入TIME_WAIT状态,但破坏了TCP协议的正常工作方式),SO_LINGERshutdown无影响。
    7
TCP连接上出现RST和随后可能的TIME_WAIT状态没有直接关系,主动发FIN包方必然会进入TIME_WAIT状态,除非不发送FIN而直接以发送RST结束连接。

 

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值