TCP 协议的相关特性
-
TCP更复杂一些。16位源端口号、16位目的端口号,32位序号、32位确认序号... 还有四位首部长度(报头长度,单位4字节),6位保留位(考虑可扩展性);6个标志位(TCP最核心的属性);16位窗口;16位校验和;16位紧急指针;选项;数据
-
确认应答ack应答报文。可以通过编号区分数据先后,每一个字节都有编号,连续递增,即“TCP序号“,应答报文是”TCP的确认序号“。在报头中。“可靠传输机制”:确认应答和超时重传。
-
TCP是字节流的,一个TCP数据报和下一个天然就是可拼接的,不像UDP存在传输的上限。
-
应答报文在六个标志位中的第二个ack就是1,序号和确认序号都有效,默认情况下不携带数据。普通报文ack0,序号有效确认序号无效。
-
丢包:有可能是丢数据或者ack。发送方会有设置超时时间,到时间后会重传数据。接收方有接收缓冲区,确保数据不重复。 每重传一次,超时时间的间隔会变大,重传的频率会降低。重传达到一定次数后,会尝试“重置/复位连接”发一个特殊的数据包“复位报文”,如果能成功就会重置连接,使通信可以继续进行。如果还是有严重问题,复位报文无回应,TCP会单方面放弃连接。
-
连接:通信双方各自保存对方的信息。
-
连接管理“三次握手(建立连接),四次挥手(断开连接)”。握手是打招呼,不携带业务数据,只有报头。syn同步。三次握手的意义:
-
投石问路,初步验证通信链路是否畅通,是可靠传输的“前提条件”。
-
确认通信双方各自的发送能力和接收能力是否都正常。
-
让通信双方在进行通信之前,对通信过程中需要用到的一些关键参数进行协商。确立tcp起始序号。
-
-
断开连接:双方各自把对方的信息删除掉。断开连接不一定是客户端主动。四次挥手。其中ack是内核控制触发的,但是fin的触发是通过应用程序调用close/进程退出来触发。
-
几个状态:
-
listen 服务器把端口绑定好,进入的状态,初始化完毕准备迎接客户端。
-
established 客户端和服务器都会进入的状态。
-
close_wait被动断开连接的一方进入这个状态,即先收到fin的一方,等待代码执行close方法。Server端出现大量的CLOSE_WAIT状态,是由于Server没有发送FIN ACK报文,导致Server状态一直是CLOSE_WAIT状态。
-
time_wait主动断开连接的一方,等待一段时间后就会释放。防止最后一个ack丢包。2MSL 数据报在网络传输在消耗的最大时间。可以帮助 TCP 的全双工连接可靠释。是为了保证重新生成的 socket 不受之前延迟报文的影响。是为了让旧数据包消失在网络中。
-
-
滑动窗口,把“发送一个等待一个”改成“发送一批等待一批”,缩短了等待时间。一批发送的数据的字节数称为窗口大小。收到一条的ack就立刻发下一条。降低可靠性带来的损失。
-
ack丢了,无需处理。后一个ack能涵盖前一个ack的含义。
-
数据包丢了。
-
-
流量控制让接收方的处理能力反向制约发送方。通过接收缓冲区剩余空间大小用ack包返回,发送方根据其调整。窗口探测包、窗口更新通知。
-
拥塞控制,在传输链路的视角控制传输速度。根据丢包率控制发送速度。慢启动,指数增长,线性增长,丢包,减小
-
延时应答提升效率。返回ack时间慢一些。
-
捎带应答
-
面向字节流。粘包问题,粘的是TCP携带的载荷(应用层数据包),明确包之间的边界。
-
可以指定分隔符/指定数据的长度。用xml、json等解决
-
-
异常情况处