TCP

Feature

  • TCP 提供面向连接的, 可靠的”字节流”服务;
  • TCP 使用校验和, 确认和重传机制来保证可靠传输;
  • TCP 使用数据分节排序, 来确保数据的顺序以及非重复;
  • TCP 使用滑动窗口机制来实现流量控制, 通过改变窗口大小进行拥塞控制;

Note

TCP并非一定保证数据的到达, 而是尽可能的传达数据, 否则就告知接收方, 即我不保证我的数据一定到达, 但是我的售后还是可以的.

Three-way handshake

Intro

Three-way handshake, 三次握手, 即建立连接时需要在 C/S 之间发送3个报文, 以识别对方. 三次握手的目的即在建立 TCP 连接时, 同步连接双方的sequeue number 和 Ack number, 交换窗口大小信息. 其简单过程:

  1. hi, 我的身份证: 123456, 姓名: 郑碧峰, 我请求 SYN( 建立连接)
  2. hi, 我要连接郑碧峰, 他的身份证( ACK ): 123456 + 1, 我的身份证: 9999, 我请求连接
  3. hi, 我要传输, 我们之前沟通过, 密码是: 9999 + 1, SYN=0(不是建立连接啦)

State

  • 第一次握手: SYN=1, seq=123456, 指明端口建立 TCP 连接, Client(LISTEN->SYN_SEND);
  • 第二次握手: SYN=1, ACK=1, 同时存在连接请求和确认请求, seq=9999, acknumber=123456 + 1, Server(LISTEN->SYN_RCVD)
  • 第三次握手: ACK=1, 确认请求, acknumber=9999 + 1, Client(SYN_SEND->ESTAB), 服务器在接到请求后( SYN_RCVD->ESTAB )

Scheme

three-way-handshake

Four-way handshake

Intro

四次挥手( TCP Connection Termination Procedure), 实际为2次分手, 但是 TCP 为全双工, C/S 两方都需要FIN/ACK 才能真正的关闭连接, 到最后 C/S 都进入CLOSING 状态. TIME_WAIT 状态. 其简单过程:

  1. hi, 我的最新身份证: 123, 姓名: 郑碧峰, 我请求 FIN (断开连接), 办理分手
  2. hi, 这是给郑碧峰的响应, ACKnum=123 + 1, 我同意离婚, 让我准备下
  3. hi, 我的最新身份证: 456, 姓名: 小媛媛, 请求 FIN, 我准备结束了, 办理分手
  4. hi, 这是给小媛媛的响应, ACKnum=456 + 1, 我同意离婚, 相忘于江湖

Statue

  • 第一次挥手: FIN=1, seq=123, Client(ESTAB->FIN_WAIT_1), 此时Client可接受数据
  • 第二次挥手: ACK=1, ACKnum=123 + 1, Server(ESTAB->CLOSE_WAIT), Client接收到包后( FIN_WAIT_1->FIN_WAIT_2)
  • 第三次挥手: FIN=1, seq=456, Server(CLOSE_WAIT->LAST_ACK), Client(FIN_WAIT_2->TIMED_WAIT), 此时Server不能再次发送数据
  • 第四次挥手: ACK=1, ACKnumber=456 + 1, Client(TIMED_WAIT->CLOSED), Server(LAST_ACK->CLOSED)

其中客户端在第四次握手之后, 会保留TIMED_WAIT 状态, 持续时间: 2 * max segment

Scheme

four-way handshake

TIME_WAIT

TIME_WAIT存在的理由是基于 TCP 的全双工设计:

  • 可靠的实现全双工终止: 避免第四次的 ACK 丢失, 需要等待并重发, 否则在 CLOSED 时会发送 RST 包, 从而产生报错信息
  • 允许老的重复分解消逝: 在网络传授过程中, 可能存在一些超时连接在很长时间之后到达,但是这时该ip/port可能已经建立新的连接, 那么问题就大发了(前任, 现任), 所以设置 TIME_WAIT , 进行该状态的 IP/PORT 建立新的连接.

滑动窗口

整体通信

tcp-connection

滑动窗口控制

TCP利用滑动串口来控制 C/S 端的数据发送, 买卖双方在进行”三次握手”时会互相告知对方,
“我的店里有多少货”, “我的店里已经被预订但是未发出去的货”, 通过这种窗口大小来控制
店里的生意平稳的进行.

  • 窗口合拢: 数据被发送并确认时
  • 窗口张开: 接收方接收到数据并将确认返回给发送端时
  • 窗口收缩: 暂不建议

silding-window

拥塞控制

发送端定义拥塞窗口,在慢启动时, 拥塞窗口为1MSS, 每次收到ACK就加1,每次发送根据拥塞窗口和接受窗口中的最小值发送数据.

随着包的每次往返, 拥塞窗口就会慢慢指数增长, 知道最后线性增加, 超过一定阀值之后又
会重启该过程.

实现功能: 控制发送端的发送速率, 确保接收端来得及处理, 基于”滑动窗口”来完成.