三次握手的作用和意义
1.通信双方了解到彼此的存在,客户端是探测服务端的存在,服务端是感知到客户端的存在
2.彼此交换链接参数信息,用于协商链接的配置属性
过程如下:
第一步:客户端发送SYN报文段给服务端,内容包含要要连接的的端口号和自己随机生成的初始序号(这个初始序叫(ISN(c)))
第二步:服务端发送SYN报文段作为相应,内容包含,自己随机生成的初始序列号(这个初始序列叫ISN(s)),和ACK,这个ACK是第一步的客户端发来的序列号+1
第三步:客户端发送SYN报文段,发送第二步的服务端的初始序列号+1作为ACK
自此之后,客户端和服务端发送的任何报文段的序列号逐次递增?
思考,如果第三步,客户端没有收到任何报文段,那么多长时间会放弃等待呢?
思考,序列号用完了怎么办?会出现问题吗?
思考,当第三步完成,服务端要等待ACK,那么此时服务端一直等不到ACK的到来,那么服务端会认为失败吗?等待这个ACK需要多长时间呢?
为何是三次握手,而不是四次握手?
TCP协议从三次握手可以看出有一个显著的特点,有报文段,必然有ACK报文段!!!保证报文段必须被对方收到!!!若对方没有收到,就认为网络有问题,那么自己再重发一次,若多次发送,仍然没有收到ACK,那么就认为对方已经掉线了,放弃这个链接。
各种mq和rpc框架需要ack的原因?
因为tcp协议层发送数据在应用层无法感知是否通过网卡发送出去,是否已经发送到网卡的发送缓冲区,更无法感知是否已经被对方收到,所以,需要使用应用层的ACK机制来让对方确认是否已经收到。
应用层协议需要心跳检测的原因?
根本的原因TCP协议没有空闲检测机制,需要让应用层尽量早的发现网络已经断开连接,若是客户端,则马上重连,若是服务端,则马上销毁这个链接,释放资源。