【linux服务器编程学习】3、TCP协议

TCP服务特点

TCP是传输层的主要协议之一,相对于UDP,TCP的特点是面向连接、字节流和可靠传输。

使用TCP的双方都需要先建立连接,为连接分配必要的内核资源。TCP是全双工的,完成数据交换后双方必须断开连接以释放系统资源。

TCP的连接只能是一对一的,所以基于广播和多播的应用程序无法使用TCP。

字节流的概念:应用程序对于数据的发送和接收没有边界限制。

TCP传输是可靠的,体现在序号机制、应答机制、超时重传机制、校验机制。

TCP头部请添加图片描述

  • 16位源端口号和16位目的端口号,告诉主机该报文来自那个端口以及传递给那个端口。
  • 32位序列号
  • 32位确认号
  • 4位头部长度
  • 6位标志位
    • URG 经济指针是否有效
    • ACK 确认号是否有效
    • PSH 接收端应用程序 立即从接收缓冲区中读走数据
    • RST 请求重新建立连接
    • SYN请求建立连接
    • FIN通知对方要关闭连接
  • 16位窗口大小,流量控制手段
  • 16位校验和,检验TCP报文段是否损坏
  • 16位紧急指针,是一个对当前序列号的偏移,是向接收端发送经济数据的方法

唯一确定一个TCP连接

TCP四元组可以唯一确定一个TCP连接

  • 源端口
  • 源IP
  • 目的端口
  • 目的IP

TCP 连接建立过程

请添加图片描述

TCP建立连接的过程就是三次握手

  • 客户端向服务器发送SYN,设序列号seq=p,客户端发送后变为SYN_SEND状态
  • 服务器收到SYN后返回ACK,序列号seq=q,响应号ack=p+1,服务器收到后变为从LISTEN变为SYN_RECV
  • 客户端收到ACK后返回ACK,响应号ack=q+1,客户端收到后变为ESTABLISHED
  • 服务器收到后变为ESTABLISHED

为什么需要三次握手?

  • 确认双方通信时初始化序列号,防止通信乱序。
  • 如果是两次握手,假如服务器确认丢失,连接并未断开,客户端重新发送连接申请,就会对一个客户端保持多个连接,造成资源浪费。
  • 通信双方都需要发送SYN和ACK,共四部,服务器的 SYN和ACK合并了,所以是三次。

TCP释放连接的过程

请添加图片描述

TCP释放连接的过程就是四次挥手

  • 客户端向服务器发送FIN,seq=p,发送从ESTABLISH变为FIN_WAIT_1
  • 服务器收到FIN后,返回ACK,ack=p+1,状态从ESTABLISH变为CLOSE_WAIT
  • 客户端收到ACK后,状态变为FIN_WAIT_2
  • 服务器发送FIN,seq=q,ack=p+1,发送后变为LAST_ACK
  • 客户端收到FIN后,返回ACK,seq=p+1,ack=q+1,状态变为TIME_WAIT,等待2MSL后变为CLOSED
  • 服务器收到ACK后,变为CLOSED

为什么要四次挥手?

TCP是全双工的,客户端和服务器都需要发送ACK和FIN,共四次。在客户端主动关闭的情况下,服务器收到客户端的FIN,代表客户端没有数据要发送给服务器了,但是服务器可能还有数据要发送给客户端,就先回复一个ACK表示收到了FIN,当所有数据发送完后才发FIN

为什么TIME_WAIT后要经过2MSL后才变为CLOSED?

保证主动关闭方发送的最后一个ACK报文能够到达对端,当没有到达时对端重发FIN,主动关闭方需要重发ACK

TCP和UDP的区别

  • TCP是面向连接的,UDP是无连接的
  • TCP是一对一的,UDP可以一对一、一对多、多对多
  • TCP是可靠交付数据的,无差错、不丢失、不重复、有序,UDP是尽最大努力交付,不保证可靠性
  • TCP首部较长,没选项字段时有20字节,UDP首部8字节
  • TCP是流式传输,没有边界,UDP是一个一个包发送,有边界
  • TCP的数据大于MSS,在传输层分片,收到后在传输层组装,UDP的数据大于MTU,在网络层分片,收到后在网络层组装

TCP超时重传

  • 发送数据时,设置一个定时器,当超过指定时间没有收到对方的ACK后就重发数据
  • 两种情况会触发超时重传
    • 数据包丢失
    • 应答包丢失
  • 数据往返时延RTT,是数据从发送到收到确认的时间差值,超时重传时间RTO应略大于RTT

TCP快速重传

不以时间为驱动,以数据为驱动重传。当收到了3个相同的ACK报文,会在定时器过期之前就重传丢失的报文

滑动窗口

往返时间较长的情况下,也不会降低通信的效率

  • 窗口大小:无需等待确认,可以继续发送数据的最大值,是接收端告诉发送端自己还有多少缓冲区可以接收数据,由接收方确定窗口大小。
  • 累计确认:某个报文丢失了,也不会进行确认,而是通过下一个确认报文确认。

流量控制

可以让发送方根据接收方实际接收能力控制发送数据量,流量控制是借助滑动窗口实现的。

  • 如果发送方发送速度过快,接收方来不及接收,就会有分组丢失,为避免分组丢失就要控制发送方发送速度。
  • 使接收方返回的ACK包中包含自己接收窗口大小,利用窗口大小来控制发送方发送速度
  • 流量控制死锁:发送方收到一个窗口大小为0的应答,停止发送,等待下一个窗口不为0的应答,若下一个窗口不为0的应答丢失,双方一直等待。
  • 避免方法:发送方每收到一个窗口大小为0的应答,启动计时器,时间到后主动发报文查询。

拥塞控制

网络出现拥堵时,如发送大量的数据包,可能导致数据包时延、丢失等,这时重传就会加剧网络负担,进入恶性循环。

  • 拥塞窗口cwnd是发送方维护的一个状态变量,根据网络拥塞程度变化
  • 变化规则:只要网络中没有出现拥塞,cwnd增加,出现拥塞则cwnd减少

请添加图片描述

  • 拥塞控制算法:慢启动、拥塞避免、拥塞发生、快恢复
  • 慢启动:发送方每收到一个ACK,cwnd加1,大于慢启动门限ssthresh时,进入拥塞避免
  • 拥塞避免:每收到一个ACK时,cwnd加1/cwnd
  • 拥塞发生:当发生数据包重传时认为拥塞发生,包括超时重传和快速重传
    • 超时重传:ssthresh设置为cwnd/2,cwnd重置,重新开始慢启动
    • 快速重传:cwnd=cwnd/2,ssthresh=cwnd,进入快恢复
  • 快恢复:cwnd=ssthresh+3,重传丢失的数据包,如收到重复的ACK,cwnd+1,收到新ACK,cwnd设为第一步的ssthresh,进入拥塞避免 。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值