TCP
TCP
TCP特点
TCP的主要特点:
面向连接 :TCP协议会将通信双方建立起连接
- 如何做链接管理的?通过TCP三次握手来建立连接、通过TCP四次挥手来断开连接
- 重传机制有哪些?
- 超时重传:发送数据时设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重新发该数据。超时周期是动态变化的,会出现超时周期相对较长的情况。于是就出现了快速重传。
- 快速重传:当发送方收到三个相同的ACK报文时,会在定时器过期之前,重传丢失及丢失之后的所有数据包。会出现重传没有收到的数据还是重传没有收到数据之后的所有数据?
- SACK(选择确认性):在TCP的头部选项里添加一个SACK,让发送方知道哪些数据没有被成功收到,可以只重传没有收到的数据
- D-SACK:优化了SACK
- 可以让发送方知道是发送的包丢失了,还是接收方返回的ACK包丢失了
- 可以知道是不是发送方发送的包是不是被网络延迟了
- 可以知道网络中是不是把发送方的数据包给复制了
可靠的:TCP是一种可靠的传输协议,通过使用确认和重传机制来确保数据可靠性
面向字节流
怎么保证数据的有序性?给每个数据编上序列号,并且发送总数据长度及每个数据的长度,从而来确定数据是否有序,有便于传输后的确认及丢失后重传不会出现乱序。
粘包问题
粘包问题指服务端接收多个数据包时,无法区分这些数据包的边界,导致解析错误。
解决方法:一般通过固定消息的长度、用特殊字符作为边界、使用自定义消息结构三种方式来进行分包
所以TCP主要用于上传下载、HTTP请求、文件传输等场景
TCP的三次握手

客户端:closed(关闭状态)、服务端:closed(关闭状态)
第一步:客户端发送SYN(包)给服务端。这个包包含了客户端的初始序列号以及请求建立连接的标志位(SYN=1)
客户端:SYN_SENT(同步已发送状态)、服务端:LISTEN(监听状态)
第二步:服务端接收到SYN包后,会发送一个SYN/ACK(同步/确认)包给客户端。这个包包含了服务器的初始序列号以及对客户端的请求建立连接的确认。
客户端:SYN_SENT(同步已发送状态)、服务端:SYN_RCVD(同步已接收状态)
第三步:客户端收到SYN/ACK包后,会发送一个ACK(确认)包给服务器,确认服务器的请求建立连接。此时连接已经建立,客户端和服务器可以开始进行数据传输。
客户端:ESTABLISHED(已建立连接状态)、服务端:ESTABLISHED(已建立连接状态)
通过三次握手,客户端和服务器就建立了可靠的连接。这种机制可以确保双方都同意建立连接,并且可以互相确认对方的请求和确认。
TCP的四次挥手

客户端:ESTABLISHED(已建立连接状态)、服务端:ESTABLISHED(已建立连接状态)
第一步:当客户端想要关闭连接时,它发送一个FIN(结束)包给服务器,表示不再发送数据给服务端了。
客户端:FIN_WAIT_1(终止等待状态1)、服务端:CLOSE_WAIT(关闭等待状态)
第二步:服务端收到FIN包后,发送一个ACK包给客户端,确认收到了客户端的关闭请求,但是可能还有一些数据没有处理完
客户端:FIN_WAIT_2(终止等待状态2)、服务端:LAST_ACK(最后确认状态)
第三步:服务器发送一个FIN包给客户端,表示服务器也准备关闭连接
客户端:TIME_WAIT(时间等待状态)、服务端:CLOSED(关闭状态)
第四步:客户端收到FIN包后,发送一个ACK包给服务器,确认收到了服务器的关闭请求,此时连接关闭
TCP的保活机制Keepalive
如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。
- 如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
- 如果对端主机宕(dàng)机(死机)(注意不是进程崩溃,进程崩溃后操作系统在回收进程资源的时候,会发送 FIN 报文,而主机宕机则是无法感知的,所以需要 TCP 保活机制来探测对方是不是发生了主机宕机),或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。