面试遇到的问题
2016-10-25 20:51
232 查看
1、TCP的三次握手(建立连接)和四次挥手(关闭连接)
理解:窗口和滑动窗口 TCP的流量控制
TCP使用窗口机制进行流量控制
什么是窗口?
连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端
接收方发送的确认信息中包含了自己剩余的缓冲区尺寸
剩余缓冲区空间的数量叫做窗口
2. TCP的流控过程(滑动窗口)
TCP(Transmission Control Protocol) 传输控制协议
三次握手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
客户端TCP状态迁移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态迁移:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
各个状态的意义如下:
LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT -在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING -等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;
TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。
(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
确认号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。
图1 TCP三次握手建立连接
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1
关闭连接
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
TCP采用四次挥手关闭连接如图2所示。
图2 TCP四次挥手关闭连接
2、多线程队列中如何确定是否已执行完毕?
我们很多时候需要在队列完成之后再进行操作,而何时队列完成,NSOperationQueue并没有内置的didFinishedSelector来供使用,因此需要自己去检查其状态。因为NSOperationQueue兼容 key-value
coding (KVC) and key-value observing (KVO)机制,因此我们可以观察NSOperationQueue的属性。NSOperationQueue可供监控观察的属性有:
operations- read-only property
operationCount- read-only property
maxConcurrentOperationCount- readable
and writable property
suspended- readable and writable property
name- readable and writable property
实现如下:
1.初始_parseQueue
[cpp] view
plain copy
- (NSOperationQueue *)parseQueue
{
if (nil == _parseQueue)
{
_parseQueue = [[NSOperationQueue alloc] init];
[_parseQueue setSuspended:YES];
//[_parseQueue setMaxConcurrentOperationCount:1];
[_parseQueue addObserver:self
forKeyPath:@"operations"
options:0
context:nil];
}
return _parseQueue;
}
2.加入operation
[cpp] view
plain copy
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(myTask)
object:nil];
[self.parseQueue addOperation:operation];
[operation release];<strong>
rong>
3.观察值的改变:
[html] view
plain copy
//KVO,观察parseQueue是否执行完
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if (object == self.parseQueue && [keyPath isEqualToString:@"operations"])
{
if (0 == self.parseQueue.operations.count)
{
DLog(@"parse finished");
//other operation
[_parseQueue setSuspended:YES];
}
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
相关文章推荐
- 面试中遇到的问题
- 面试里经常遇到的一个关于StringBuffer和final的问题
- 面试遇到的问题
- hadoop面试可能遇到的问题
- 最近面试遇到的几个问题
- 继续发两道面试中遇到的问题,大家做做看。^_^
- Linux面试时遇到的问题
- C/C++ 面试前 遇到问题总结
- 最近面试中遇到的海量数据库设计问题
- hadoop面试时可能遇到的问题,你能回答出几个 ?
- 面试的时候遇到的问题:二叉树
- 在面试时遇到不了解的问题,如何顺畅的与面试人员交流?
- 几次面试都遇到同一个问题,真是郁闷,长时间不写正则快忘了
- 技术人员在面试中常遇到的问题
- 55个常遇到的面试问题
- 面试中可能遇到的问题
- 面试遇到的20大问题
- 15个应聘不同职位所遇到的让你摸不着头脑的面试问题
- Java基础面试遇到问题(一)
- hadoop面试时可能遇到的问题,你能回答出几个 ?