TCP—传输控制协议

是一种面向连接的可靠传输协议。可靠、有序、无丢弃和不重复。

特点:

  • TCP是面向连接(虚连接)的传输层协议
  • 每一条TCP连接有且只能有两个端点。
  • 可靠、有序、无丢弃和不重复。
  • TCP协议提供全双工通讯
    • 发送缓存
      • 存放发送方TCP准备发送的数据。
      • TCP已发送但是没有收到确认的数据。
    • 接收缓存
      • 存放发送端发送来的不按照顺序到达的数据
      • 按照顺序到达的数据,但并未被应用程序读取
  • TCP是面向字节流的。TCP将应用层数据仅看做是一串无结构的字节流。
TCP连接的四元组(源IP、源端口、目IP、目端口)--->唯一标识一条TCP连接。套接字--->IP:port
TCP报文:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fhwh-1258460726.cos.ap-nan

确认序列号:接收方期望收到发送方发送的下一个字节的序号。1.接收方希望接收到的报文序号;2.该序号之前的数据以全部接收。—–累积确认机制

选项字段:长度可变。MSS数值、窗口扩大因子、时间戳、选择确认机制。

确认位ACK:当ACK=1时,确认号有意义。在连接建立以后,所有传输的报文段都必须将该标志位置为1.同步位SYN:SYN=1时,代表该数据段是一个连接请求报文。终止位FIN:当FIN=1时,表明此报文段发送方数据已发送完毕,要求释放连接。复位RST:表明TCP连接出现严重错误,需要释放连接并重新建立连接。紧急位URG:代表该报文中存在高优先级的数据,应尽快处理。需要配合紧急指针使用。推送位PSH:接收方应尽快将接收到的数据交付给对应应用程序。(现在接受的所有)


![

TCP的可靠性

确认、重传、排序、流控

排序:
MTU:最大传输单元--->以太网环境下1500字节--->数据包大小。MTU = IP + TCP/UDP + 数据(MSS)MSS:最大数据段长度IPv4:分段后可以分片IPv6:PMTU整条路经找最小
确认:

ACK

重传:
超时重传:RTT--->往返时间(指发出端将数据发送后,到本端接收到对端反馈的确认报文的时间总和)RTO--->超时重传时间RTO取值略大于RTT值。快速重传机制--->根据接收方的反馈信息进行数据重传。客户端需要连续接收到三次确认序列号相同的ACK报文,则认为数据丢失,需要进行数据重传。快速重传机制会导致部分数据重复传输,降低数据传输效率。解决思路:使用选择确认机制。--->在TCP首部的选项字段中,添加上未接收到的数据信息。发送方接收到该确认报文后,会根据选项字段内容,重新传输缺少的数据部分。选择确认机制是否可以执行是需要通讯双方进行协商的。--->在三次握手的前两次SYN报文中进行协商。

RTO数值是动态变化的数值超时,间隔,加倍

流控:(滑动窗口机制)
窗口:窗口的大小是可以指定的,窗口大小指的是无需等待确认报文,而可以直接发送的数据包的最大值。rwnd(接收窗口)---最开始等于整个缓存区的大小,浮动变化。

TCP要求发送方依据rwnd发送数据量。发送方的发送窗口大小是依据接收方的反馈信息中的接收窗口大小而设定的。

TCP连接的建立
TCP连接连接需要解决的问题:1、知晓对端的套接字信息2、允许双方进行参数的协商(窗口值、选择确认机制、是否使用窗口扩大因子)3、对设备进行资源分配

c/s架构,谁先发送报文谁就是客户端1.服务(CLOSED-->LISTEN)创建接受缓存空间,等待客户端的连接请求2.客户(CLOSED-->SYN-SENT)创建接受缓存空间,发送请求报文(SYN=1,seq=x),不携带数据,x(初始序列号随机数且循 环)循环带来报文延迟与下一次循环的同序列号报文先后到达解决:时间戳(双向,在前俩次握手协商)3.服务(LISTEN-->SYN-RCVD)发送接收并且请求的报文(ACK=1,ackeq=x+1,SYN=1,seq=y)4.客户(SYN-SENT-->EATABLISHED)收到报文进入下一状态,发送接收报文(ACK=1,ackeq=y+1, seq=x+1),可以携带数据5.服务(SYN-RCVD-->EATABLISHED)接受到报文进入下一状态
当TCP连接建立成功,但是客户端突发故障。此时服务端会等到2小时时间,若2小时时间内没有收到任何客户端的数据,则服务端发送一个探测报文,以后每隔75秒发送一次。若一连发送10次仍没有回复,则服务器认为客户端出现故障,关闭连接。
TCP连接释放
释放前提1、TCP连接的释放实际上是在释放本地分配给TCP连接的资源2、本地没有新的数据需要发送

客户和服务都可以释放,但一般都是客户端1.客户(ESTABLISHED-->FIN-WAIT-1)发送报文(FIN=1,seq=m,ACK=1,ackeq=v)m非随机值,而是累计确认机制最后得到的值2.服务(ESTABLISHED-->CLOSE-WAIT)发送报文(ACK=1,ackeq=m+1,seq=v)3.客户(FIN-WAIT-1-->FIN-WAIT-2)接受到报文4.服务(CLOSE-WAIT-->LAST-ACK)发送报文(FIN=1,seq=p,ACK=1,ackeq=m+1)p非随机值,在此之前客户到服务的连接关闭,但 服务还可以发送数据,所有seq还在累计的增加5.客户(FIN-WAIT-2-->TIME-WAIT-->CLOSED)发送报文(ACK=1,ackeq=p+1,seq=m+1),在发送后,会等个2MSL时间后进入连接断开状态,MSL是报文段在网络中存活的时间,为两分钟。6.服务(LAST-ACK-->CLOSED)接受到报文
双方同时释放连接