王嘉贝

导航

TCP

TCP 协议

  1. TCP协议的特点
  2. TCP报文首部构成
  3. TCP的连接管理
  4. 流量控制
  5. 拥塞控制

相关网页资源:

简书
TCP socket


TCP协议特点与应用

TCP是建立在不可靠的IP层之上的实现的可靠的数据传送协议,主要解决的传输的可靠性,有序,无丢失,无重复。
TCP是TCP/IP体系中非常复杂的一个协议

1)TCP是面向连接的传输层协议。
2) 每个TCP提供的连接两个端点 TCP的连接是点对点 1对1的
3)提供可靠的交付服务。保证数据的无差错不丢失,不重复,且有序;
4) TCP提供全双工的通信。 允许双方进程在任意时候都可以发送数据。设有发送缓存和接收缓存用来临时存放双向通信的数据
5) TCP面向字节流,交互一次是一个数据块。是做无结构的字节流

TCP报文首部

TCP报文的首部最短20B,后面4N B的数据根据需要增加的选项增加; TCP报文段及可以用来运载书又可以用来建连接,释放了连接和应答

各个字段的意义如下:

  1. 源端口和目的端口各占2B 16bit ;
  2. 序号字段 4B, TCP是面向字节流的组个字节传送的所以TCP每个字节都便上了一个序号, 例如一个
    字段值301携带的数据100B那么下一个报文段序号从401开始
  3. 确认号字段: 期望收到的下一个报文段数据的第一个字符的序号 确认好位N描述道序号N-1的数据已经正确收到
  4. 数据偏移(首部长度)4位,单位是4B最大TCP首部长度 (2^4-1)*4B = 60B
  5. 保留字段 6位,为了以后使用目前设置位0,可以忽略不计
  6. 紧急位,1bit URG=1表示有效,字段内有紧急数据 尽快传送,高优先级
  7. 确认位 ACK ACK=1表示确认有效,建立连接后的所有报文段必须设置ACK=1
  8. 推送位 PSH=1 尽快交付给应用进程,不在等到整个缓存填满之后再交付
  9. 复位位 RST =1 表示出现严重错误 例如主机崩溃必须释放连接,重新建立运输连接
  10. 同步位 SYN=1,这是一个请求连接或者连接接受报文 当SYN=1 ACK=0 表示请求连接连接; ACK=1 SYN=1 表示同意连接,请求响应
  11. 中止位 FIN=1 表示数据已发送完毕,请求断开连接
    12。 窗口字段,2B 表示允许对方发送的数据量 ,缓存空间是有线的,单位是字节 例如确认号是701 窗口字段是1000 表示发送报文段的以房还有接受1000B的缓存空间
  12. 校验和2B, 校验包括首部和数据的两个部分 和UDP一样加上12B的伪首部
  13. 紧急指针字段;
  14. 选项字段,长度可变 只规定了最大的报文字段MSS
  15. 填充字段

TCP连接建立 - 3次握手

TCP把连接作为最基本的抽象,每个TCP连接都有两个端点,不是主机也不是IP也不是应用进程
而是传输层的协议端口也称之为套接字 socket或者插口 端口拼接道IP地址就是掏钱爱案子

主动发器连接的进程叫做客户机,被动等待连接建立的应用叫做服务器

第一步:

客户机向服务器发送一个TCP请求报文; 
SYN标志位位1,客户机随机选择一个其实序号seq=x 不携带数据但是消耗一个序号;  

第二步:

服务器接收到报文段之后如果同意建立连接就发挥确认,并且为连接建立分配TCP缓存和变量   
SYN和ACK都设置位1,确认号字段位x+1,并发送序号y

第三步:
收到确认报文后向服务器发发送确认 ACK设置位1序号字段位x+1,确认号字段y+1
可以携带数据,如果部携带数据就不消耗序号

通过上述3步骤之后,就建立了TCP连接,提供的是全双工的通信任何时候都可以发送数据。 因为服务器资源段是第二次握手
时候分配的客户端实在第三次我收拾分配的,服务器容易收到SYN洪范攻击

SYN泛洪攻击


TCP连接的释放 4次挥手

第一步:

    客户机打算关闭连接的时候,向TCP发送一个连接释放报文段,并停止发送数据; 关闭了TCP连接,FIN报文段被设定成1; 
    seq = u; 等与前面传送过的数据的最后一个字节序号加1;  全双工的时候,可以想象一条TCP路上由两个数据通路。
    发送FIN的一段不在发送数据但是还可以接受数据 

第二步:

    服务器收到报文后发送ack=u+1; 报文段自己的序号是v已经传送过的字节序好加  处于版关闭状态;
    服务器发送数据客户机让然要接受,没有关闭服务器道客户机的连接方向 

第三步:

    如果已经没有想要客户机发送的,通知TCP释放连接 FIN=1 

第四步:
客户端收到连接后发送确认 ACK=1, ack=w+1 , seq=u+1;

连接3步骤:

  1. SYN=1,Seq=x;
  2. SYN=1,ACK=1,seq=y,ack=x+1
  3. ACK=1,seq=x+1, ack=y+1

释放连接:

  1. FIN=1,seq=u ;
  2. ACK=1,seq=v, ack=x+1;
  3. FIN=1,ACK=1,seq=w,ack=u+1;
  4. ACK=1,seq=u+1,ack=w+1;

TCP 可靠传输

  1. 序号 每个字节都会有的序号
  2. 确认 期望收到下一个报文段第一个字节的序号,未收到确认的报文段请求即时重传
  3. 两种时间会导致TCP报文段进行重传: 1. 超时 2. 冗余ACK
    保留了一个往返时间RTT,保留了一个加权的平均往返时间RTTs。 超时计时器设置超时重传时间 RTO
    冗余ACK: 冗余ACK较好的检测丢包的确认。 1 2 3 4 5 如果2好丢失,无法到达B, 3 4 5 就成了时序

TCP流量控制

主要是为了控制流量方式缓存器移除的可能性;
TCP提供一种基于滑动窗口协议的控制机制。
报文段中窗口字段值限制对方网络注入报文的速率,
根据当前的拥塞程度而估计的窗口之称之为拥塞窗口 cwnd
接收方允许连续接受的最大能力 rwnd 窗口保证A不会使得B移除
实际大小取决与 rwnd cwnd的最小值;

TCP 拥塞控制

为了防止过多的数据注入网络,保证网络中的路由器和链路不至于过载;

慢开始算法 
刚开始建立好连接的时候开始发送TCP报文段时候,拥塞窗口cwnd = 1; 最大报文长度MSS。 没收到一个新的报文段 cwnd加1;  
逐步增加发送方的拥塞窗口cwnd; 分组注入网络的速率更加合理;  
没经过一个RTT拥塞窗口就会嘉贝,增大到一个规定的慢开始阈值 ssthresh改用拥塞避免算法  


拥塞避免算法
每经过一个RTT增加一个MSS而不是嘉贝,cwnd按线性缓慢曾昭,当出现超时的时候零满开门ssthresh等与当前窗口的一半 但不能小于2   
cwnd < ssthresh 慢开始
cwnd > ssthresh 慢开始改用拥塞避免算法
cwnd == ssthresh 都可以使用 通常使用拥塞避免算法 


快重传
根据使用了冗余ack来检测丢包的发生,也用于网络拥塞的检测。
当发送方连续收到3个重复的ACK报文段的时候,直接重传对方没有收到的报文段不必等待报文段设置的重传计时器 

快恢复  
发送端收到连续3个冗余ACK。执行乘法减小算法。然后执行避免拥塞算法,而不是从慢开始重新开始

posted on 2021-07-25 15:20  toBeGeek  阅读(113)  评论(0编辑  收藏  举报