`
fj_ding
  • 浏览: 37116 次
社区版块
存档分类
最新评论

面试心得与总结-——答案整理_7 持续更新

阅读更多
TCP/IP

 

1. OSITCP/IP各层的结构与功能,都有哪些协议。

1:应用层:HTTPFTPDHCPSMTP(推协议),POP3(拉取协议),DNS

(表示层:数据格式的转换和加密,如FTP协议可以采用二进制形式传输还是ASCII传输,都可以在这儿进行转换,加密算法MD5SHA1MD5SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5SHA1快,SHA1MD5强度高。))

(会话层:控制通信是全双工还是半双工,管理用户登录和注销,和session很像)

2:运输层:TCPUDP

3:网络层:IP协议,ICMP协议,ARP协议,RARP

4:链路层:以太网,令牌环。

 

2. TCPUDP的区别。

TCP协议面向连接,UDP协议面向非连接(三次握手,四次挥手);

TCP协议传输速度慢,UDP协议传输速度快

TCP协议可靠的,UDP协议不可靠的;

TCP有丢包重传机制,UDP没有(与无连接无关);

TCP有拥塞控制,UDP没有(与无连接无关)

 

3. TCP报文结构。

1TCPTransmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层协议

2TCP报文分为报头和数据,报头中主要的字段:源地址和端口号,目的地址和端口号,确认号(syn报文),滑动窗口大小。检验和(目的,计算发送端的报头和数据,然后得出一个数字,报文接受段采用同样的校验方式来计算得出校验和值,如果两个相同,则接受,不相同,则可能才传输过程中发送数据被人修改,不接受,MD5是常被用来校验一个文件是否被改变)。

 

4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

1. 三次握手建立连接:第一次握手:建立连接时,客户端发送syn(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYNack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

 

 

2:对于四次挥手,客户端想主动断开,则发送一个FIN指令以后,自己进入FIN_WAIT_1状态,服务端此时知道客户端想要断开,自己进入  CLOSE_WAIT状态,但是此时两端都是还是可以相互通信的,如果此时服务端有数据,则会发送给客户端一个ACK报文(告诉客户端我知道了),客户端接收到ACK则进入FIN_WAIT_2阶段(暂时阶段),然后继续传输数据,数据传输完成以后,然后服务端发送FIN指令,此时客户端接受到FIN指令,自己进入LAST_ACK状态,然后发送一个ACK他本可以马上关闭了,但是客户端并没有马上关闭而是进入TIME_WAIT状态,处在该状态以后保持2RTT(大概四分钟吧)就客户端的Socket就自动关闭了,这是因为可能是最后的那个FIN先收到,而在FIN之前的包还为到达客户端(网络延迟),所以要等一等。

 

3: 为什么有FIN_Wait_1FIN_wait_2?

这是因为第一个发送了fin命令之后,服务端有两种发送情况一种是没有数据发送了。直接发送ACK+FIN,所以FIN_WAI_1理解我第等待fin也就可以了,还有就是服务器还有数据发送,那么他先发给服务端ack,等数据传输完成以后再发送fin,所以这儿理解为等待fin也是可以理解的。

4:默认是客户端想主动断开,所以发送FIN以后自己就不会主动传输数据了,也就是不会调用write(),但是会调用read()进行读取,所以服务端关闭socket不需要停留2RTT

5:为什么要三次连接,最简单解释,两个人爬山,山顶的人向山脚的人喊了一声,而山脚的人听到了,就回答了一句:知道了,但是他并不知道山顶的人是否听到,这样就会发生很多问题。

两次连接的问题

1:服务端有可能发送一次无用连接,占用服务器资源。

当客户端发送一个syn进行连接,由于网络延迟,此时客户端没有收到ack,服务端也没有收到ack,此时客户端再次发送syn进行连接,这次和服务端建立了连接,然后发送完数据,通信完成,此时第一个syn包来了,服务端以为客户端又来了,因为是两次,所以开放资源和客户端建立连接,然后该连接是无效的。

2:发生死循环(建立连接以后服务端主动发送数据的情况);

当服务端接受到客户端的连接请求syn包时,发送ack包,然后建立连接,此时就开始向客户端发送数据,但是由于网络不稳定,服务端的ack并没有被客户端收到,但是客户端却收到了服务端发送的数据,但是此时不是客户端想要的ack,丢弃,然后继续发送syn包,服务端不管该syn包,然后继续发送数据,客户端发现该数据还是不是需要的ack,继续发送syn包。一直持续下去。

 

 

5. TCP拥塞控制。

拥塞控制算法:“慢启动”(Slow Start)、“拥塞避免”(Congestion voidance)、“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery

1. 慢启动:早期开发的TCP应用在启动一个连接时会向网络中发送大量的数据包,这样很容易导致路由器缓存空间耗尽,网络发生拥塞,使得TCP连接的吞吐量急剧下降,一看是先发送一个segment到服务器,服务器正常返回ack以后就发送两个segment,如果服务器正确返回,则继续增减一个发送的segment的数据,也就是逐渐增大拥塞窗口的大小,(2^n

2. 拥塞避免: 如果按上述慢启动的逻辑继续下去而不加任何控制的话,必然会发生拥塞,因此设置一个动态阈值来控制拥塞窗口的大小,当拥塞窗口的大小小于阈值的大小,就属于慢启动阶段,随着拥塞窗口越来越大,甚至超过了阈值,则网络会逐渐发生拥堵状况,这时就会将发送阈值降为原来的一般,并把拥塞窗口的大小设置为初始值(发生第一次拥塞以后变成线性增长的发送)

3. 快速重传,(当接收到冗余ack和长时间接受不到对应的ack的时候就,就会发生重新发送对应序列号的分组),当快速重传的时候则将阈值设置为原来的一半,并发送丢失序号的分组。

4. 快速恢复(是对快速重传的补充): 那么,什么是快速恢复呢?我们通常认为client接收到3个重复的ack后,就会开始快速重传,但是,如果还有更多的重复ack呢,如何处理?这就是快速恢复要做的,事实上,我们可以把快速恢复看作是快速重传的后续处理,它不是一种单独存在的形态。快速重传之后吧马上增大下一个发送分组的数量,也就是阈值+3segment的大小。为什么要增加3segment呢,这时因为一个发送端收到了3ack,就确认有三个分组被正确接收,为了最大利用网络,保证在网络中的分组数量一致,就在增加了3segment

 

6. TCP滑动窗口与回退N针协议。

1.TCP的滑动窗口只在发送端和接收端才有,滑动窗口是用于流量控制的,注意滑动窗口与拥塞窗口的区分,拥塞窗口除了在发送端和接收端有,路由器也是有的。拥塞窗口是用于拥塞控制的(该窗口是试探性窗口,为了最大利用网络,该窗口一直在变动)。

2. 流量控制:用于窗口时接收方的缓存器的大小的窗口才叫滑动窗口。

公式:可以接收窗口大小=存器窗口大小-【刚接收到的窗口大小-刚被读取的窗口的大小】,可以接收窗口的大小是要发送到tcp的发送端的。发送方通过接收到大窗口的大小来判断是否可以发送多少数据到接收端才比较合适。

同时在接收端也是有算法的:接收方保证:接收端可接收窗口大小>刚发送的的分组数-刚接受到的分组数的ack,也就是未被确认的分组的大小小于接收方可接受窗口的大小。接收方缓存器窗口大小是固定的。

3. 流控制是一种局部控制机制,其参与者仅仅是发送方和接收方,它只考虑了接收端的接收能力,而没有考虑到网络的传输能力;而拥塞控制则注重于整体,其考虑的是整个网络的传输能力,是一种全局控制机制。正因为流控制的这种局限性,从而导致了拥塞崩溃现象的发生。

4:回退N步和选择重传都是解决流水线的差错恢复的两中基本方法;

1. 回退N步:就是将各个分组编号,假如滑动窗口的大小是4,那么一次传输过去四个分组,如果对方接受到一个分组,且分组序号的大小比上一个提交分组的序号大1,则发送一个ack给发送端并提交分组,如果发送端接收到ackackbase序号相同,则滑动窗口向后移动。如果接受到的分组不是比提交的分组大1,则会丢弃该分组,这样发送端如果在定时器超时的时间之内没有接受到ack,则回重新发送分组;

缺点:就是如果有一个分组没有被接收而被丢弃,那么可能同一个窗口发送过来的好多分组都会被丢弃。这样就造成了网络的浪费,同时滑动窗口越大,虽然网络的利用率越大,但是一点一次传输过去的是base序号的分组失序或者丢失,则之后整个窗口分组都会被重新发送。(GBN协议只需要一个定时器)

2. 选择重传:由于GBN协议可能会将失序的分组丢掉,其实失序的分组有时候是没有必要被重新传输的,只需要用一个buffer存存好就可以了。选择重传有在发送方每一个分组都有一个定时器(重点,也是缺点),假如滑动窗口大小是4,如果接受方接收到的分组不比上一个提交的分组序号大1,则会将该分组收分组存入buffer中,等下一个正确的分组到来以后和他一起提交,并将刚接手到;而对于接受方来说:如果一个分组未收到确认,如果超过该分组定时器的时间,则将该分组重新发送,如果ack接受到一个base序号的分组,则滑动窗口向后移动,如果滑动窗口接受到的序号不是base序号的ack,则会将base后面序号的ack先确认,但是此时发送方的滑动窗口并不会向后滑动,只有base序号的ack回来以后滑动窗口才会向后移动。(SR选择重传在没有收到想要的序号的时候返回的是ack中包含的是想要的序号的ack,而不是刚刚接收到的分组的序号

3TCP用于解决流水线的差错恢复方法:使用的协议是GNB协议和SR选择重传的综合:GBN协议是只有一个超时定时器,而SR选择重传每一分组有一个定时器,TCP采用的是设置一个定时器(所有的分组的超时时间就是一样的)。但是在ack确认和接收方序号乱的时候采用的SR协议来实现的。

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics