网络面试题

近期面试,下面这些是经常被问到的网络编程部分的内容,当然也是做TCP UDP编程最基础的知识,借此机会总结归纳在此。

1.TCP的三次握手连接:

client发起连接请求SYN

server回应连接请求的SYN-ACK

client再回复一个确定连接的ACK

网络面试题_第1张图片

2.TCP的四次挥手:

client断开连接的请求FIN

server回复答应断开连接请求的ACK

server向client发起断开连接的请求FIN

client回复同意断开连接的ACK

网络面试题_第2张图片

3.七层协议

网络面试题_第3张图片

4.TCP的11种状态变换

这个自行google,没必要完全记清楚,需要的时候再查资料。

5.TIME_WAIT和CLOSE_WAIT  

CLOSE_WAIT:对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT, 此时我方要调用close()来使得连接正确关闭。属于对方先关闭,我方的状态。

TIME_WAIT:我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT,持续2*MSL(Max Segment Lifetime),缺省为240秒。属于我方先关闭,四次挥手完成后我方的状态。

6.TIME_WAIT状态有什么用?时间有多长?如何解决服务器中TIME_WAIT过多的问题?

TIME_WAIT出现的时机在上面TCP的四次挥手图中有说明。TIME_WAIT状态在2MSL时间内保留连接。

我方关闭连接后,TIME_WAIT状态持续2*MSL(Max Segment Lifetime),缺省为240秒。当服务器短时间内收到大量请求后关闭连接就出现TIME_WAIT增长的情况。

解决TIME_WAIT过多方法:

vim /etc/sysctl.conf 加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

./sbin/sysctl -p 让参数生效

7.TCP协议的REST包有什么用?

这篇文章将REST包发生的情况介绍的非常清楚,《TCP异常终止(reset报文)》:

http://hi.baidu.com/vants_yyz/item/bdd54888fc255f5fe63d1942

REST包的用途,总的说来,当网络连接不存在系统发送该包告知连接者,或者想要断开连接时也可发送该包告知连接者。

8.TCP的可靠传输机制有哪些?

(1). 重发丢失的数据包:发出报文后启用定时器,等待目的端确认收到该报文,否则重发该报文;

(2). 当收到对端数据后,将发送一个确认;

(3). 无错误数据传输:校验首部和数据,保证数据无差错传输;

(4). 有序数据传输:根据序号排序,可能收到的数据序号错误,TCP会重新排序后才交给应用层;

(5). 舍弃重复的数据包;

(6). 阻塞/流量控制:设置一定的缓冲空间,防止缓冲区溢出;

(7).  面向连接(确认有创建三方交握,连接已创建才作传输)

9.TCP包头和UDP包头的长度,以及分别包含什么数据?

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。

UDP承载的数据大小就应该是 1500 – IP头(20) – UDP头(8) = 1472(BYTES)
TCP 承载的数据大小就应该是 1500 – IP头(20) – TCP头(20) = 1460 (BYTES)

TCP包头数据结构:

网络面试题_第4张图片

UDP包头数据结构:

网络面试题_第5张图片

10.UDP client端不调用connect和调用connect有什么区别?

答:

UDP协议中使用connect与TCP中的connect完全不相同的概念,UDP中connect并没有三次握手,只是在本机系统中绑定该socket与哪一个IP端口进行通信。connect以后 直接使用send和recv,不必使用sendto和recvfrom。显然connect后的UDP通信效率比非connect要高。

有如下的一些好处:
1)选定了对端,内核只会将绑定对象的对端发来的数据报传给套接口,因此在一定环境下可以提升安全性;
2)  会返回异步错误,如果对端没启动,默认情况下发送的包对应的ICMP回射包不会给调用进程,如果用了connect,嘿嘿
3)发送两个包间不要先断开再连接,提升了效率。

11.详述recv函数返回值的意思?

答:http://blog.csdn.net/chenziwen/article/details/5798507

if (len > 0)
    recv data
else if(len == 0)
    socekt closed
else
{
    if (len == -1 && ((errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR)))
        continue
    else
    socket error
}

12.

select下可读可写的产生条件

1.下列四个条件中的任何一个满足时,一个套接口准备好读:

a.该套接口接收缓冲区中的数据字节数大等于套接口接收缓冲区的低潮标记,对于TCP和UDP而言,其缺省值为1;

b.该连接的读这一半关闭,对这样的套接口的读操作将不阻塞并返回0;

c.该套接口是一个监听套接口且已完成的连接数不为0;(就是accept成功返回)

d.其上有一个套接口错误等待处理,对这样的套接口的读操作将不阻塞并返回-1;

2.下列四个条件中的任何一个满足时,一个套接口准备好写:

a.该套接口发送缓冲区中的可用空间字节数大等于套接口发送缓冲区的低潮标记,对于TCP和UDP而言,其缺省值为2048;

b.该连接的写这一半关闭,对这样的套接口的写操作将产生SIGPIPE信号;

c.该套接口早先使用非阻塞式connect以建立连接,并且连接已经异步建立,或者connect以失败告终;

d.其上有一个套接口错误等待处理,对这样的套接口的写操作将不阻塞并返回-1;

3.select与非阻塞connect一起使用的时候有以下两个注意点:(1)当连接成功建立时,描述字变为可写;(2)当连接建立遇到错误时,描述字变为既可读又可写;

13.SIGPIPE信号何时出现?

答:

   建立链接后,如果一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGPIPE信号,通知进程此连接已经断开。而SIGPIPE信号的默认处理是终止程序。所以一般使用signal(SIGPIPE, SIG_IGN);忽略掉这个信号。

你可能感兴趣的:(网络面试题)