个人面试总结
个人面试心得,后面会不断更新。
首先展示一张tcp协议连接的状态图:
1.为什么需要三次握手,而不是两次或者四次?
面试被问到这样一个问题,自己的回答不是很好,就总结了下。之所以要进行三次握手,是因为使用的时全双工通道通信方式。
全双工通信是是连接的两端技能发送数据又能接收数据的一个过程。如果只进行两次握手会出现以下的问题:例如A和B进行通信,当A发送的连接请求可能会因为数据报丢失,从而在此进行重传,当B接收到请求之后,就建立连接了,此时A可以向B发送数据了,当两端发送数据之后,就会断开,而原先丢失的数据如果因为网络原因,延迟到达B的连接请求,当B接收之后,就在此和A进行连接了,但实际上A已经不再向B发送数据了,此刻,连接虽然建立了,B会等待A发送数据,但是A已经不再向B发送数据了,造成B空等待。;另外还可能造成死锁,使用两次连接,因为考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的***,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
2.进程同步和异步
同步的概念是,几个线程相互协调来处理一件事情,按照先后顺序,协调来完成一件事情,例如说,两个线程完成某个功能,当线程a完成某个步骤,之后停下来,并唤醒线程b去执行另外的步骤,当b完成得到相应的结果后,再次唤醒a继续执行,两个线程相互协调来完成某种功能的过程。(进程亦如此)
异步的概念是,一个进程发出调用之后,不管有没有结果返回,他会继续执行后面的任务,等待结果返回时,会通知该进程的。例如两个人交流,a向b发送了一条消息,不管b收没收到,继续做其他的事情,当收到a的消息时再去处理对应的事件。
3.同步传输和异步传输
异步传输:
通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是可变的,并不需要严格地限制它们的时间关系。起始位对应于二进制值 0,以低电平表示,占用 1 位宽度。停止位对应于二进制值 1,以高电平表示,占用 1~2 位宽度。一个字符占用 5~8位,具体取决于数据所采用的字符集。例如,电报码字符为 5 位、ASCII码字符为 7 位、汉字码则为8 位。此外,还要附加 1 位奇偶校验位,可以选择奇校验或偶校验方式对该字符实施简单的差错控制。发送端与接收端除了采用相同的数据格式(字符的位数、停止位的位数、有无校验位及校验方式等)外,还应当采用相同的传输速率。典型的速率有:9 600 b/s、19.2kb/s、56kb/s等。
异步传输又称为起止式异步通信方式,其优点是简单、可靠,适用于面向字符的、低速的异步通信场合。例如,计算机与Modem之间的通信就是采用这种方式。它的缺点是通信开销大,每传输一个字符都要额外附加2~3位,通信效率比较低。例如,在使用Modem上网时,普遍感觉速度很慢,除了传输速率低之外,与通信开销大、通信效率低也密切相关。
同步传输:
同步传输是以数据块为传输单位。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列 (如16位或32位CRC校验码),以便对数据块进行差错控制。所谓同步传输是指数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时间关系。
4.同步阻塞和异步阻塞
同步阻塞:在发送方发送一个数据报之后,需要等待收到接收方的回应才会将继续发送下一个数据包,否则,一直阻塞等待。优点是保证数据传输正确性。缺点是,如果一直等待阻塞,浪费资源。
异步阻塞:在发送方发送一条数据之后,不管接收方是否收到,继续发送下一个数据报。优点:处理时间不会因为没有收到相应而无休止的等待下去,可以节省出来更多的资源去处理其他的事情。缺点:不保证数据处理的准确定。
5.如何处理tcp连接中出现大量TIME_WAIT的情况。
tcp协议连接是一个面向连接的过程,建立一个tcp连接需要经过三次握手,断开连接需要经过四次挥手。每种都有其相关的状态,在tcp连接中只要是主动关闭连接都会经过TIME_WAIT状态。通常是客户端是主动关闭的一方,之所以存在TIME_WAIT状态,是为了方式,当连接断开的时候,主动关闭一方等待一个2MSL的时间,方式最后一个挥手确认包因网络问题丢失,导致服务端不能收到确认包,从而在服务端任务还没有彻底断开连接,仍旧可以向客户端发送数据,故而,主动关闭的一方,等待一个TIME_WAIT时间,当确认包丢失,通过重传,从而达到最后的上次挥手,让连接彻底断开。
通常是因为在高并发中的短连接中,客户端主动关闭,之后进入time_wait状态,并等待一个2msl时间,在这个时间段内,该链接中的四元组信息是无法被使用的,如果有过多的主动主动关闭,从而就会导致出现大量的time_wait状态的半连接,没个等待的连接都会等待一个2msl时间,从而可能导致四元组的端口被占用完,导致其他客户端无法建立新的连接过程。
在内核配置参数中可查看可用端口的数量:
cat /proc/sys/net/ipv4/ip_local_port_range 9000 65500
在可以加大如上的端口数量,这样可以变过多的time-wait但是指标不治本。
应用程序中设置socket的SO_LINGER选项参数;
客户端机器打开tcp_tw_recycle和tcp_timestamps选项; 设置重传和时间限制参数
客户端机器打开tcp_tw_reuse和tcp_timestamps选项;设置端口回收和时间限制参数
客户端机器设置tcp_max_tw_buckets为一个很小的值;设置加大最大连接等待数量,建议值增大,避免减小该选项。
可以在应用程序中设置socket地址重用状态,这样在空闲是回收该地址,进行复用。
通过以上的方法可以改善出现大量time_wait情况。