教学互动网站开发背景,目前做那个网站能致富,网站开发实训心得,头条广告入口连接的三次握手 客户端向服务器发送SYN请求 服务器发送ACK回应请求#xff0c;并同时发送一个SYN的请求给客户端 客户端回应ACK应答 关闭的四次握手 对于关闭流程#xff0c;一共有三种情况#xff1a;客户端主动关闭#xff0c;服务器端主动关闭#xff0c;客户端和服务器…连接的三次握手 客户端向服务器发送SYN请求 服务器发送ACK回应请求并同时发送一个SYN的请求给客户端 客户端回应ACK应答 关闭的四次握手 对于关闭流程一共有三种情况客户端主动关闭服务器端主动关闭客户端和服务器端同时主动关闭。这里仅仅以客户端主动关闭为例列出下图。 客户端主动关闭发送FIN请求 服务器回应ACK应答 服务器被动关闭发送FIN请求 客户端回应ACK应答 对于关闭流程服务器端和客户端是对等的地位其它两种场景处理过程类似。需要注意的是由于对端是是可以主动关闭的因此在代码中需要加上被动关闭的响应流程。 为什么连接和关闭握手次数不一样 看到上述流程可能有一个疑问为什么连接和关闭的握手次数不一样其实不论是连接还是关闭客户端和服务器端都是发送了一次请求SYN/FIN回应了一次应答ACK它们是对称的。但是在连接的时候服务器端的请求和应答是在一次握手中同时完成的而关闭的时候却是分两次完成的所以就造成了连接和关闭的握手次数不对称。 现在新问题又来了为什么连接时复用一次握手而关闭的时候不复用握手这个则是因为连接和关闭的行为不是一样所造成的。 在连接过程中客户端是主动连接服务器端是被动连接这个顺序是确定了的因此可以复用第二次握手。 在关闭的过程中客户端和服务器端可能同时主动关闭此时就不能复用第二次握手了因此请求和应答需要单独的发送。 Tcp连接的状态迁移图 前面只考虑了理想的情况在实际的过程中可能还需要处理一些异常操作如下则是一个完成的TCP连接的状态迁移图。 半打开连接和半关闭连接 如前所述建立或关闭一个连接时需要三或四步的在这个过程中TCP连接则会处于一个半打开或半关闭状态。例如前面状态图中的FIN_WAIT_1和FIN_WAIT_2就是半关闭状态。 一般来说半连接只是一个暂停的过程。但是在一些异常的情况的时候如远端主机故障的时候常常会造成半关闭连接由于Tcp连接处于半打开或半关闭状态的时候仍然会占用相应的端口资源尤其对于http之类的海量服务来说会造成大量端口被占用会造成资源的浪费。 另外有的程序也针对Tcp协议的这一特征来恶意进行网络攻击。例如对于一个服务器大量的恶意客户端建立连接后既不发请求也不close套接字这种情况下服务器如何保护自己呢。因为如果听之任之的话大量的恶意连接会耗尽服务器的可用描述符导致服务器不能服务。就算服务器主动close如果客户端不close的话那么这个连接还是不能完全释放。对于服务器来说需要增加相应的机制进行半连接的处理。