TCP
TCP和UDP的区别
TCP面向连接,UDP面向非连接
TCP保证数据顺序,UDP不保证
TCP保证数据正确性,UDP不保证
TCP对系统资源要求多,UDP要求少
TCP传输速度慢,UDP速度快
可靠传输服务
保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样。
序号
TCP首部的序号字段用来保证数据有序地进入缓存区,序号值是报文段发送的数据的第一个字节的序号。
累计确认
TCP首部的确认号是期望收到对方的下一个报文段序号,只确认至第一个丢失字节为止的字节。
重传
导致重传的两种事件:超时和冗余ACK。
1.超时
每发送一个报文段,就设置一个计时器。如果计时器时间到了但没有收到确认,则重传该报文段。问题是超时周期太长。
2.冗余ACK
冗余ACK指再次收到某个报文段的ACK。每当比期望序号大的失序报文段到达时,接收方发送一个冗余ACK,指明下一个期待字节的序号。当发送方收到对同一个报文段的3个冗余ACK时,就认为这个被确认报文段之后的报文段已经丢失,然后对这个丢失的报文段进行重传。
三次握手和四次挥手
为什么客户端最后还要发送一次确认呢?
防止滞留一段时间的连接请求报文突然又传送到了服务器端,从而产生错误。如果采用两次握手,该请求报文会重新建立连接,造成资源浪费;如果采用三次握手,该请求报文会使服务器端发送SYN+ACK报文,但是客户端不会再次发送ACK报文(客户端只想建立一次连接),不会重新建立连接。
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接时,服务器端在LISTEN状态下,收到连接请求SYN报文后,发送SYN+ACK报文给客户端。 关闭连接时,服务器端收到客户端FIN报文时,只表示客户端不再发送数据但是还能接收数据,服务器端先发送ACK报文给客户端后,再发送FIN报文给客户端表示同意关闭连接,即ACK和FIN分开发送,从而导致多了一次。
设置TIME_WAIT状态的目的是什么?
1. 连接关闭:发起断开的一端进入TIME_WAIT状态,服务端占用原端口,应避免进入该状态;在最后的FIN或ACK丢失导致超时重传FIN并在2MSL(MSL,Maximum Segment Lifetime,报文段的最长寿命)内被接收后,重传ACK报文并重启2MSL计时器。
2. 使过时的重复报文段FIN失效:新连接必须在前一个连接进入TIME_WAIT状态2MSL后才发起。
go zookeeper心跳抓包分析
抓取zk客户端和服务端心跳包
zk客户端同1s内发送1个包含12个字节的心跳请求包和1个没有数据的确认包。
zk服务端同1s内发送1个包含20个字节的心跳响应确认包。
参考资料