在面试的过程中,TCP三次握手是一个出现频率比较多的话题。三次过程如下图所示:
Client Server
|------------SYN1----------->|
| |
|<------SYN2+ACK1---------|
| |
|--------- ACK2------------->|
下面列一些常见的几个问题。
1. Q:向一个不存在但合法的公网IP任意端口发送SYN包会出现什么情况?
A:返回ICMP主机不可达。
2. Q:向一个存在的IP但未绑定的端口发送SYN包会出现什么情况?
A:返回TCP RST segment。
3. Q: 第一个SYN包丢失了,客户主机(主动连接方)会采取什么动作?
A:重传,重试几次后(一般是3次)失败后,连接失败。
4. Q: 为什么连接建立的过程作3次TCP segment交互,而不是4次?
A:Server端的SYN&ACK在一个TCP segment传给了Client。
5. Q:什么情况下将会出现4次TCP segment交互?
A: 连接的两端同时打开。
6. Q: 第二个SYN2(就是图示中的SYN2+ACK1)丢失了,将出现什么情况?
A: Client收不到SYN2而不发送ACK2,Server端将超时重发。
7. Q: ACK2丢失了将会怎样?
A: Server端认为Client没收到SYN2+ACK1,重发SYN2+ACK1;另外连接处于未完成的状态,如果出现大量的ACK2丢失,未完成的连接队列会出现“满”的状态,从而不能再接收SYN1。这就是DOS。
还有一些和Socket APIs结合起来的问题,比如connect内部做了什么?accept做了什么?accept执行速度慢了将会出现什么现象?等等。这个问题可以参考上一篇文章:
http://blog.csdn.net/herm_lib/archive/2010/11/14/6008281.aspx