1、三次握手和四次挥手?
三次握手:
LISTEN: 表示服务器端的某个 SOCKET 处于监听状态, 可以接受连接了。
SYN_SENT: 当客户端 SOCKET 执行 CONNECT 连接时, 它首先发送 SYN 报文, 因此也随即它会进入到了 SYN_SENT 状态, 并等待服务端发送三次握手中的第 2 个报文。SYN_SENT 状态表示客户端已发送 SYN 报文。
SYN_RCVD: 这个状态表示接收到了 SYN 报文, 在正常情况下, 这个状态是服务器端的 SOCKET 在建立 TCP 连接时的三次握手会话过程中的一个中间状态, 很短暂, 基本上用 netstat 你是很难看到这种状态的, 除非你特意写了一个客户端测试程序, 故意将三次
TCP 握手过程中最后一个 ACK 报文不予发送。 因此这种状态时, 当收到客户端的 ACK 报文后, 它会进入到 ESTABLISHED 状态。 ( 服务器端)
ESTABLISHED: 表示连接已经建立了。
四次挥手:
FIN_WAIT_1: 这个状态要好好解释一下,其实 FIN_WAIT_1 和 FIN_WAIT_2 状态的真正含义都是表示等待对方的 FIN 报文。 而这两种状态的区别是: FIN_WAIT_1 状态实际上是当 SOCKET 在 ESTABLISHED 状态时, 它想主动关闭连接, 向对方发送了 FIN 报文,此时该 SOCKET 即进入到 FIN_WAIT_1 状态。 而当对方回应 ACK 报文后, 则进入到FIN_WAIT_2 状态, 当然在实际的正常情况下, 无论对方何种情况下, 都应该马上回应 ACK报文, 所以 FIN_WAIT_1 状态一般是比较难见到的, 而 FIN_WAIT_2 状态还有时常常可以用 netstat 看到。 ( 主动方持有的状态)
FIN_WAIT_2:上面已经详细解释了这种状态,实际上 FIN_WAIT_2 状态下的 SOCKET,表示半连接, 也即有一方要求 close 连接, 但另外还告诉对方, 我暂时还有点数据需要传送给你(ACK 信息), 稍后再关闭连接。 ( 主动方的状态)
TIME_WAIT: 表示收到了对方的 FIN 报文, 并发送出了 ACK 报文, 就等 2MSL 后即可回到 CLOSED 可用状态了。如果 FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK标志的报文时, 可以直接进入到 TIME_WAIT 状态, 而无须经过 FIN_WAIT_2 状态。 ( 主动方的状态) 。
CLOSING( 比较少见) : 表示双方同时关闭连接。 如果双方几乎同时调用 close 函数,那么会出现双方同时发送 FIN 报文的情况, 就会出现 CLOSING 状态, 表示双方都在关闭连接。 这种状态比较特殊, 实际情况中应该是很少见, 属于一种比较罕见的例外状态。 正常情况下, 当你发送 FIN 报文后, 按理来说是应该先收到( 或同时收到) 对方的 ACK 报文, 再收到对方的 FIN 报文。 但是 CLOSING 状态表示你发送 FIN 报文后, 并没有收到对方的 ACK 报文, 反而却收到了对方的 FIN 报文。 什么情况下会出现此种情况呢? 其实细想一下, 也不难得出结论: 那就是如果双方几乎在同时 close 一个 SOCKET 的话, 那么就出现了双方同时发送 FIN 报文的情况, 也即会出现 CLOSING 状态, 表示双方都正在关闭 SOCKET 连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。 当对方 close 一个 SOCKET后发送 FIN 报文给自己, 你系统毫无疑问地会回应一个 ACK 报文给对方, 此时则进入到CLOSE_WAIT 状态。 接下来, 实际上你真正需要考虑的事情是察看你是否还有数据发送给对方, 如果没有的话, 那么你也就可以 close 这个 SOCKET, 发送 FIN 报文给对方,也即关闭连接。 所以你在 CLOSE_WAIT 状态下, 需要完成的事情是等待你去关闭连接。
2、为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
3、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
4、为什么Server已经接受到了确认之后,Client还需要进行第三次握手?
防止失效的连接请求报文段突然又传送到主机B,因而产生错误。
5、简历连接的第二个syn作用是啥?
因为客户端发送的syn可能过了好久才到达,而此时客户端超时重传的SYN已经到达服务端,那么后来的SYN就是无效的,如果不发第二个1,服务端会监听延迟到达的请求,造成资源浪费。
6、如果网络连接中出现大量TIME_WAIT状态所带来的危害?
如果系统中有很多socket处于这个状态,当需要创建新的socket连接时可能后收到影响,也影响到系统扩展性。
消除办法:1)可以改为长连接。
2)修改端口范围。
3)客户端设置socket的SO_LINGER选项。
7、TCP如何保证可靠传输?
1)传递数据之前,会有三次握手
2)会启动一个定时器,等待目的端确认收到报文段。
3)发送一个确认
4)TCP保持它首部和数据的校验和。
5)重新排序再交给应用层。
6)丢弃重复数据
7)提供流量控制
8)提供拥塞控制
8、检测连接是否中断:keepalive机制和heartBeat心跳包
keepalive机制可以检测死链接,原理简单,当连接闲置一定时间,TCP会向对方发一个keepalive探针包,对方收到包之后,连接一切正常会回复一个ACK,如果丢失回复一个RST
心跳包是每隔固定时间发一次,保持长连接。
9、TCP三次握手有哪些漏洞?
1)SYN Flood攻击
发送大量伪造的TCP连接,从而使攻击方资源耗尽。
解决办法:缩短SYN Timeout时间
设置SYN Cookie(给每个IP分配一个Cookie,如果短时间内连续收到某个IP的SYN报文,就认定收到了攻击)
SYN Cache技术
硬件防火墙
2)Land攻击
通过向一个目标主机发送一个用于简历请求的TCP SYN报文而实现对目标主机攻击。
限制每个源IP的连接数
对恶意连接的IP进行封禁。
主动清除残余连接
10、listen的真正目的?
为了侦听端口创建两个队列,未完成队列和已完成队列,如果不调用,客户端传过来的SYN无法入队。