1. TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。(废弃连接问题)
如果采用两次的话,会出现下面这种情况。
比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;
于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。
传完东西后,断开。
结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。
2. 三次握手改成仅需要两次握手,死锁是可能发生
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,
并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁
3. TCP通讯中,select到读事件,但是读到的数据量是0,为什么,如何解决????
select 返回0代表超时。select出错返回-1。
select到读事件,但是读到的数据量为0,说明对方已经关闭了socket的读端。本端关闭读即可。
当select出错时,会将接口置为可读又可写。这时就要通过判断select的返回值为-1来区分。
4. 2MSL(maximum segment lifetime)
(1).等待一段时间,防止最后的FIN的ACK包丢失,对方未收到ACK会重发FIN
(2).TCP连接在2MSL时间内 ip,port不能重新被bind
5.复位报文(RST)
(1).接收到不存在端口的连接请求,回复RST包(但是udp是响应ICMP端口不可达的error)
(2).异常终止一个连接,发送RST包,收到RST的一方终止该连接。
(3).收到一个半开连接的数据包后,回复RST,收到RST的一方终止该连接。
6.几种情况
(1).服务器未开启服务,回复RST
(2).服务器连接正常关闭,回复FIN
(3).服务器进程异常终止,回复RST。
(4).服务器直接掉电,如果客户端没有"发送数据"或者"设置keepalive选项",客户端将一直保持此半开连接。
如果客户端重新连接,将新建立一个连接。
(5).服务器重启时,如果收到一个半开连接的数据包,回复RST.
如果采用两次的话,会出现下面这种情况。
比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;
于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。
传完东西后,断开。
结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。
2. 三次握手改成仅需要两次握手,死锁是可能发生
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,
并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁
3. TCP通讯中,select到读事件,但是读到的数据量是0,为什么,如何解决????
select 返回0代表超时。select出错返回-1。
select到读事件,但是读到的数据量为0,说明对方已经关闭了socket的读端。本端关闭读即可。
当select出错时,会将接口置为可读又可写。这时就要通过判断select的返回值为-1来区分。
4. 2MSL(maximum segment lifetime)
(1).等待一段时间,防止最后的FIN的ACK包丢失,对方未收到ACK会重发FIN
(2).TCP连接在2MSL时间内 ip,port不能重新被bind
5.复位报文(RST)
(1).接收到不存在端口的连接请求,回复RST包(但是udp是响应ICMP端口不可达的error)
(2).异常终止一个连接,发送RST包,收到RST的一方终止该连接。
(3).收到一个半开连接的数据包后,回复RST,收到RST的一方终止该连接。
6.几种情况
(1).服务器未开启服务,回复RST
(2).服务器连接正常关闭,回复FIN
(3).服务器进程异常终止,回复RST。
(4).服务器直接掉电,如果客户端没有"发送数据"或者"设置keepalive选项",客户端将一直保持此半开连接。
如果客户端重新连接,将新建立一个连接。
(5).服务器重启时,如果收到一个半开连接的数据包,回复RST.