1 可靠的字节流服务

TCP的特点是:面向连接、字节流、可靠传输:

  • 发送应答机制,每个发送的报文都必须得到接收方的应答,才认为是传输成功。
  • 超时重传机制,发送每个报文胡会启动定时器,规定时间内没有疏导应答,就重发该报文。
  • TCP对接收到的IP数据包进程重排、整理,保证不会乱序

TCP和UDP的传输结构如下:
image.png
image.png

2 TCP结构

2.1 头部结构

固定头部结构如下:
image.png

  • 源端口号:表示报文来自哪里
  • 目的端口号:报文传给哪个上层协议或应用程序
  • 序号:一次TCP通信中某一个传输方向上字节流的每个字节的编号,保证不乱序
  • 确认号:接收方的响应,下一次报文需要携带上一次的报文响应
  • 窗口大小:告诉对方,本端接收缓冲区还能容纳多少字节

    2.2 头部选项

    TCP选项字段是可变长的可选信息,典型的选项如下:
    image.png

    3 TCP状态机

    下图描述了所有的TCP状态和可能的状态转换(虚线表示服务器端的状态变化,实现表示客户端的状态变化):
    image.png
    下图列出来基本的状态变化和三次握手的过程:
    image.png

    4 带外数据

    带外数据(Out Of Band),用于迅速告知对方本端发生的重要事件,比普通数据(也叫带内数据)优先级更高,应当立即发出。
    TCP在头部提供紧急指针标志和紧急指针两个字段,利用传输普通数据的连接来传输紧急数据。

发送端一次发送多字节的带外数据时,只有最后一个字节被当作带外数据,其他数据被当作普通数据,如下图结构:
image.png
接收端在接收到紧急指针标志URG之后,回根据紧急指针的位置获取带外数据(指针前一位),并读入一个特殊的缓存中(带外缓存,一个字节),供应用层读取。

如果TCP设置了SO_OOBINLINE选项,则带外数据会被当作普通数据放在接收缓冲区,紧急指针仍然可以用于读取带外数据。