是一种面向连接的可靠传输协议。可靠、有序、无丢弃和不重复。
特点:
-
TCP是面向连接(虚连接)的传输层协议
-
每一条TCP连接有且只能有两个端点。
-
可靠、有序、无丢弃和不重复。
-
TCP协议提供全双工通讯。
-
发送缓存
-
存放发送方TCP准备发送的数据。
-
TCP已发送但是没有收到确认的数据。
-
-
接收缓存
-
存放发送端发送来的不按照顺序到达的数据
-
按照顺序到达的数据,但并未被应用程序读取
-
-
-
TCP是面向字节流的。TCP将应用层数据仅看做是一串无结构的字节流。
<span style="background-color:#f8f8f8"><span style="color:#333333">TCP连接的四元组(源IP、源端口、目IP、目端口)--->唯一标识一条TCP连接。
套接字--->IP:port</span></span>
确认序列号:接收方期望收到发送方发送的下一个字节的序号。1.接收方希望接收到的报文序号;2.该序号之前的数据以全部接收。-----累积确认机制。
选项字段:长度可变。MSS数值、窗口扩大因子、时间戳、选择确认机制。
<span style="background-color:#f8f8f8"><span style="color:#333333">确认位ACK:当ACK=1时,确认号有意义。在连接建立以后,所有传输的报文段都必须将该标志位置为1.
同步位SYN:SYN=1时,代表该数据段是一个连接请求报文。
终止位FIN:当FIN=1时,表明此报文段发送方数据已发送完毕,要求释放连接。
复位RST:表明TCP连接出现严重错误,需要释放连接并重新建立连接。
紧急位URG:代表该报文中存在高优先级的数据,应尽快处理。需要配合紧急指针使用。
推送位PSH:接收方应尽快将接收到的数据交付给对应应用程序。</span></span>
TCP的可靠性
确认、重传、排序、流控。
<span style="background-color:#f8f8f8"><span style="color:#333333">MTU:最大传输单元--->以太网环境下1500字节--->数据包大小。
MSS:最大数据段长度</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">RTT--->往返时间(指发出端将数据发送后,到本端接收到对端反馈的确认报文的时间总和)
RTO--->超时重传时间
RTO取值略大于RTT值。
快速重传机制--->根据接收方的反馈信息进行数据重传。客户端需要连续接收到三次确认序列号相同的ACK报文,则认为数据丢失,需要进行数据重传。
快速重传机制会导致部分数据重复传输,降低数据传输效率。
解决思路:使用选择确认机制。--->在TCP首部的选项字段中,添加上未接收到的数据信息。发送方接收到该确认报文后,会根据选项字段内容,重新传输缺少的数据部分。
选择确认机制是否可以执行是需要通讯双方进行协商的。--->在三次握手的前两次SYN报文中进行协商。</span></span>
RTO数值是动态变化的数值。超时间隔加倍。
<span style="background-color:#f8f8f8"><span style="color:#333333">窗口:窗口的大小是可以指定的,窗口大小指的是无需等待确认报文,而可以直接发送的数据包的最大值。
rwnd(接收窗口)---最开始等于整个缓存区的大小,浮动变化。</span></span>
TCP要求发送方依据rwnd发送数据量。发送方的发送窗口大小是依据接收方的反馈信息中的接收窗口大小而设定的。
TCP连接的建立
<span style="background-color:#f8f8f8"><span style="color:#333333">TCP连接连接需要解决的问题:
1、知晓对端的套接字信息(IP,端口号)
2、允许双方进行参数的协商(窗口值、选择确认机制、是否使用窗口扩大因子)
3、对设备进行资源分配</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">当TCP连接建立成功,但是客户端突发故障。
此时服务端会等到2小时时间,若2小时时间内没有收到任何客户端的数据,则服务端发送一个探测报文,以后每隔75秒发送一次。若一连发送10次仍没有回复,则服务器认为客户端出现故障,关闭连接。</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">TCP报文的连接:
谁先发送报文谁是客户端。
在服务端缓存空间创建完成之前客户端和服务端都是关闭状态,之后服务端进入监听状态。
第一个报文发送(是一个连接(同步)请求文SYN=1)序列号seq是随机值x,第一个报文发送后客户端进入syn-sent状态。(不携带数据)
第二个报文回复报文(ACK=1)确认序列号为x+1(代表我想要收到的下一个报文),这个报文不止是确认,还需要发送另一个SYN,序列号另一个随机值y。发送后服务端进入syn-rcvd状态,客户端收到后进入established(连接已建立)状态
第三个报文序列号seq=x+1,收到后服务端进入连接已建立状态(可以发送数据)</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">时间戳
TCP报文中的时间戳是一个关键特性,其作用主要体现在以下几个方面:
1.测量和记录传输延迟:通过在TCP报文中加入时间戳,发送方和接收方可以利用时间戳信息来计算报文的往返时间(RTT)和时延变化情况,从而评估网络的性能和稳定性。这有助于更精确地了解网络状态,以便进行相应的优化或故障排查。
2.避免序列号回绕:TCP协议中的序列号用于标识数据包的顺序。当C-S发送数据的时间足够长时,序列号可能会用完并出现回绕,导致数据包的顺序混乱。而时间戳选项可以避免这个问题,因为每次发包时都会将内核的时间记录在报文内部,即使两个包的序列号相同,时间戳也不可能相同,从而可以区分它们。
3.防止重复数据包:TCP协议中的ACK用于确认接收到数据包。如果接收到重复的数据包,会导致ACK重复发送,浪费网络带宽。时间戳选项可以通过提供更精确的时间戳信息,帮助更准确地判断数据包是否重复,从而避免不必要的ACK发送。
4.支持窗口缩放:TCP协议中的窗口大小用于控制数据流量。时间戳选项可以支持窗口缩放,通过提供更精确的时间戳信息,可以更准确地计算窗口大小,以优化数据传输效率。
综上所述,TCP报文中的时间戳不仅有助于评估网络性能,还可以解决序列号回绕、防止重复数据包以及支持窗口缩放等问题,从而提高网络传输的可靠性和效率。</span></span>
TCP连接释放
<span style="background-color:#f8f8f8"><span style="color:#333333">1、TCP连接的释放实际上是在释放本地分配给TCP连接的资源
2、本地没有新的数据需要发送</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">FIN=1(标记这个报文用来释放连接)
u是最后一次服务端发来的信息的确认序列号(ackeq)
上一次服务端发送的报文客户端要回复要有ack信息
在第二,第三报文中间还会有数据交互的
第三个报文在服务端数据发完后发送,w随机数,为了告诉客户端第一个报文的数据已经收到了,第三个报文的确认序列号和第二次一样也会是u+1
在四次挥手过程中,任何一个序列号都是根据之前相互传输报文最终产生的数值。
时间等待阶段为了防止第四个报文丢了,看服务端会不会重传
2MSL(MSL:一个报文在网络中传输的最大时间):2个报文一来一回的最大时间</span></span>
双方同时释放连接