我们知道,传输层是OSI模型中用户进行数据传输的分层,目前仅有TCP和UDP两种协议可用。TCP为了进行传输控制,引入了三次握手机制,以确保通信连接的建立。道理很简单,我们跟别人打电话聊天时,对方拿起电话接听后第一句话肯定是“喂”,而我们听到这句话,就能确定电话接通了。同样的道理,TCP建立连接时客户端先发起一个SYN包作为确认连接的请求,服务端收到后回复一个肯定的确认应答(ACK)来实现可靠的数据传输。如果客户端过一段时间仍未收到确认应答,就可断定连接失败,再次发起重连。下面看下这三次握手的过程:
第一次握手:客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;在建立连接的同时,也可以确定发送数据包的长度单位,即“最大消息长度”(MSS:Maximum Segment Size);这时侯的客户端、服务端都不知道连接是否能否建立成功;
第二次握手:服务器收到SYN包,必须确认客户的SYN请求(ack=x+1),同时自己也发送一个SYN包(seq=y),合起来即SYN+ACK包,此时服务器进入SYN_RECV状态;返回服务器的最大消息长度MSS,后续所有客户端请求数据将按服务器的MSS进行传输;当客户端收到服务端的消息后,它心里清楚自己到服务端(第一次握手)、服务端到自己(第二次握手)的两条连接都是OK的;但服务端只知道客户端 -> 服务端这一条连接是OK的,但自己往客户端的连接是否能建立&#