传输层-传输控制协议(TCP)

TCP 协议概述

传输控制协议(TCP)是Internet传输层协议。提供面向连接、可靠、有序、字节流传输服务。

  • 面向连接:应用程序在使用 TCP 之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。
  • 可靠:通过 TCP 连接传送数据,可以确保无差错、不丢失、不重复、并且按序到达。
  • 字节流:“流”指的是流入到进程或从进程流出的字节序列。应用程序和TCP的交互是一次一个数据块,TCP把应用程序交付的数据看成是一连串的无结构的字节流。
  • TCP提供全双工通信服务:TCP允许通信双方的应用进程在任何时候都能发送数据和接收数据。

TCP 为没快客户数据配上一个 TCP 首部,从而形成多个 TCP 报文段。这些报文段被交付给网络层,网络层将其分别封装在网络层IP数据报中。然后这些 IP 数据报被发送到网络中,最终送达目的主机。

TCP 报文段结构

shuyu
  • 源端口号 与 目的端口号:字段分别占 16 位,表示发送该报文段的源端口号和目的端口号,用于多路复用/分解来自或送到上层应用的数据。
  • 序号:TCP 的序号是对每个应用层数据的每个字节进行编号。
  • 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。
  • 首部长度:占 4 位,指出 TCP 段的首部长度,以 4 字节为计算单位。最短是 20 字节;最长是 60 字节。
  • 保留:占 6 位,保留为今后使用,目前值为 0。
  • URG 、ACK 、PSH 、RST 、SYN 、FIN:为标志位字段;各占 1 位,取值为 0 或 1;
    • 紧急 URG=1,紧急指针字段有效,优先传送。
    • 确认 ACK=1,确认序号字段有效; ACK=0 时,确认序号字段无效。
    • 推送 PSH=1,尽快将报文段中的数据交付接收应用进程,不要等缓存满了再交付。
    • 复位 RST=1,TCP 连接出现严重差错,释放连接,再重新建立 TCP 连接。
    • 同步 SYN=1,该 TCP 报文段是一个建立新连接请求控制段或者同意建立新连接的确认段。
    • 终止 FIN=1,TCP 报文段的发送端数据已经发送完毕,请求释放连接。
  • 接收窗:段占 16 位,向对方通告我方接收窗口的大小。
  • 校验和:占 16 位,校验和字段检验的范围类似于 UDP,计算方法与 UDP 校验和的计算方法相同。Í。
  • 紧急指针:占 16 位。URG=1 时,才有效。指出在本 TCP 报文段中紧急数据共有多少个字节。
  • 选项(长度可变):基本不用 。最短为 0 字节, 最长为 40 字节。 例如:发送方告诉接收方其缓存能够接收的数据段的最大长度是 MSS 个字节。 【最大报文段长度(Maximum Segment Size, MSS): 报文段中封装的应用层数据的最大长度。】
  • 填充:长度0~3字节,取值全为 0,目的是为了整个首部长度是 4 字节的整倍数。

TCP连接管理

三次握手

shuyu
  1. 第一次握手(请求连接):客户端座位连接建立发起端,选择客户端初始序列号 x,向服务器发送(SYN=1, seq=x)的 SYN 段。客户状态由 LISTEN 进入 SYN_SENT 状态,等待服务器确认。
  2. 第二次握手(请求连接,并响应请求连接):服务器收到客户发送的 SYN 段后,选择服务器初始序列号 y,向客户发送(SYN-1, ACK=1, seq=y, ack=y+1)的 SYNACK 段,同时,服务器状态由 LISTEN 进入 SYN_RCVD 状态。
  3. 第三次握手(确认接收响应,建立连接):客户端收到服务器的 SYNACK 段后, 向服务器发送(ACK=1, seq=x+1, ack_seq=y+1)的 ACK 段,同时,客户端进入 ESTABLISHED 状态,客户端确认连接已建立;当服务器收到 ACK 段后,也进入 ESTABLISHED 状态,也确认连接已建立。至此,双方均确认连接建立成功。

客户端状态:

  • 关闭状态 CLOSED,处于初始状态;
  • 同步已发送状态 SYN_SENT;
  • 已建立状态 ESTABLISHED,表示可以传送数据。

服务端状态:

  • 关闭状态 CLOSED,处于初始状态;
  • 监听状态 LISTEN;
  • 同步收到状态 SYN_RCVD ;
  • 已建立状态 ESTABLISHED,表示可以传送数据。

四次挥手

假设客户端首先请求断开 TCP 连接

shuyu

TCP 建立连接要进行三次握手,而断开连接要进行四次。这是由于 TCP 的半关闭造成的。因为TCP 连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闲就叫半关闭。当一方完成它的数据发送任务,就发送一个 FIN 来向另一方通告将要终止这个方向的连接。

  • 第一次挥手(请求释放):客户端发送一个 FIN=1 ,用来关闭客户端到服务器端的数据传送,客户端进入 FIN_WAIT_1 状态。意思是说"我客户端没有数据要发给你了,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。‘
  • 第二次挥手(响应请求):服务器端收到 FIN 后,先发送 ack=M+1 ,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入 FIN_WAIT_2 状态,继续等待服务器端的 FIN 报文。
  • 第三次挥手(服务端完成,终止响应):当服务器端确定数据已发送完成,则向客户端发送FIN=1报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入 LAST_ACK 状态。
  • 第四次挥手(响应彻底释放):客户端收到 FIN=1 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送 ack=N+1 后进入 TIME_WAIT 状态,如果 Server端 没有收到 ACK 则可以重传。

服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端己正常关闭,那好,我容户端也可以关闭连接了。最终完成了四次握手。

客户端状态:

  • ESTABLISHED 状态,表示可以传送数据;
  • FIN_WAIT_1 终止等待 1 状态,等待服务器端的确认;
  • FIN_WAIT_2 终止等待 2 状态,等待服务器端发出的连接释放报文段;
  • TIME_WAIT 时间等待状态,表示等待 2 倍 MSL 时间后进入关闭状态 CLOSED;

服务端状态:

  • ESTABLISHED 状态,表示可以传送数据;
  • CLOSED_WAIT 关闭等待状态;
  • LAST_ACK 最后确认状态;
  • CLOSED 关闭状态。

TCP 可靠数据传输

一、TCP 能够提供可靠的数据传输服务,是通过一下工作机制来实现的:

  1. 应用数据被分割成 TCP 任务最合适发送的数据块(统称是MSS),封装成 TCP 端,传递给 IP。
  2. 当 TCP 发出一个段后,启动一个计时器,等待目的端确认收到这个报文段。如果不能及时接收到一个确认,则认为该报文段丢失,将重发这个报文段。当 TCP 收到发自 TCP 连接另一端的数据,将发送一个确认段。
  3. TCP 首部中设有校验和字段,用于检测数据在传输过程中是否发生差错。如果收到的报文段通过校验和检测,发现有差错, TCP 将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发),而将已连续收到的应用层数据的最后一个字节的序号加 1,作为确认序号,向发送方发送确认段。
  4. 由于 TCP 报文段封装到 IP 数据报中传输,而 IP 数据报的达到可能会经过不同的路径从而造成顺序错乱,因此 TCP 报文段的到达也可能会失序。如果必要,TCP 将根据序号对接收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  5. 由于存在网络延迟和重传机制,TCP 的接收端有可能会收到多个重复的报文段,这时接收端需要根据序号把重复的报文段丢弃。
  6. TCP 能够提供流量控制。TCP 连接的每一方都在建立连接时分配一定大小的接收缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这可以防止较快主机发送数据太快,致使较慢主机的缓冲区溢出。

TCP拥塞控制

拥塞控制:通过合理调度、规范、调整向网络中发送数据的主机数量、发送速率、数据量,以避免拥塞的发生。
TCP 拥塞控制的算法包括:慢启动;拥塞避免;快速重传;快速恢复。

  • 慢启动:阈值之前的阶段称之为慢启动阶段,每经过RTT,拥塞窗口大小加倍。
  • 拥塞避免:阈值之后的阶段称之为拥塞避免阶段,每经过RTT,拥塞窗口大小增加1。
  • 快速恢复算法:当发生 3 次重复确认时,不再从慢启动阶段开始, 而是直接从新的阈值开始,直接进拥塞避免阶段。
    • 新阈值(12) =当前窗口(24)的一半;
    • 新拥塞窗口=新阈值。
  • 计时器超时:可判定发生拥塞且拥塞严重。
    • 新阈值(12)=当前窗口(24)的一半;
    • 新拥塞窗口=1
    • 然后再从慢启动阶段、拥塞避免阶段增加窗口数量。
shuyu
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值