TCP协议主要信息:
(1)TCP头部信息。TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口号,目的端端口号,管理TCP连接,控制两个方向的数据流。
(2)TCP状态转移过程。TCP连接的任意一端都是一个状态机。在TCP连接从建立到断开整个过程中,连接两端的状态机将经历不同的状态变迁。
(3)TCP数据流。通过分析TCP数据流,可从网络应用程序来了解应用层协议和通信双方交换的应用程序数据。两种类型:交换数据流和成块数据流。特殊数据,紧急数据。
(4)TCP数据流的控制。为保证可靠传输和提高网络通信质量。
一、TCP服务的特点
传输层协议主要有TCP协议和UDP协议;
TCP | UDP |
---|---|
面向连接 | 无连接 |
字节流 | 数据报 |
可靠传输 | 不可靠传输 |
1.TCP
使用TCP协议通信双方必须先建立连接,然后才能开始数据的读写。且双方都必须为该连接分配必要的内核资源,以管理连接状态和连接上数据的传输。TCP连接方式是全双工,即双方数据读写可通过一个连接进行,完成数据交换后,通信双方都必须断开连接以释放系统资源。TCP协议的连接是一对一的,因此广播和多播应使用UDP无连接协议。
TCP模块发送的TCP报文段的个数和应用程序执行写的操作次数之间没有固定的数量关系。(TCP协议采用字节流服务)
应用程序执行读的操作次数和TCP模块接收到的TCP报文段个数之间没有固定的数量关系(读取次数取决于用户指定的应用程序读缓冲区的大小)
所以发送端执行的写的操作次数和接收端执行的读操作次数之间没有任何数量关系。(字节流概念:应用程序对于数据的发送和接收没有边界限制)
2.UDP:
发送端每执行一次写操作,UDP模块将其封装成一个UDP数据报发送,接收端必须及时针对每一个UDP数据报执行读操作(通过recvfrom系统调用),否则丢包,而且如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则数据就会被截断。
3.TCP传输是可靠的:
(1)TCP协议采用发送应答机制(即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为TCP报文段传输成功)
(2)TCP协议采用超时重传机制(发送端发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发报文段)
(3)TCP协议会对接收到的报文段重排、整理再交付给应用层。
二、TCP头部结构
TCP头部信息:出现在每个TCP报文段中,用于指定通信的源端端口号,目的端端口号,管理TCP连接,控制两个方向的数据流。
1.TCP固定头部结构
(1)16位端口号(port number):告知主机该报文段的源端口和目的端口。
进行TCP通信时,客户端使用系统自动选择的临时端口号,服务器使用知名服务端口号。
(2)32位序号(sequence number):一次TCP通信(建立连接到断开)过程中某一个传输方向上的字节流的每个字节的编号。第一个TCP报文段的序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值),后续报文段序号值被系统设置WieISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。
(3)32位确认号(acknowledgement number):用作对另一方发送的TCP报文段的响应。其值是收到的TCP报文段序号值加1。
(4)4位头部长度(header length):标识该TCP头部的32bit字(4字节)的数量。因为4位最大能表示15,所以TCP头部最长为60字节。
(5)6位标志位:
URG标志 | 表示紧急指针(urgent pointer)是否有效 |
ACK标志 | 表示确认号是否有效。称携带ACK标志的TCP报文段为确认报文段 |
PSH标志 | 提示接收端应用程序该立即从TCP接收缓冲区读走数据,为接收后续数据腾出空间 |
RST标志 | 表示要求对方重新建立连接。称携带RST标志的TCP报文段为复位报文段 |
SYN标志 | 表示请求建立一个连接。称携带SYN标志的TCP报文段为同步报文段 |
FIN标志 | 表示通知对方本端要关闭连接了。称携带FIN标志的TCP报文段为结束报文段 |
2.TCP头部选项
TCP头部的最后一个选项字段(options)是可变长的可选信息,最多包含40字节。
kind:说明选项的类型。
length:指定该选项的总长度(不一定有),包括kind字段和length字段占据的2字节。
info:选项的具体信息(不一定有)。
kind=0 | 选项表结束选项 |
kind=1 | 空操作选项,无特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍 |
kind=2 | 最大报文长度选项 |
kind=3 | 窗口扩大因子选项 |
kind=4 | 选择性确认(SACK)选项 |
kind=5 | SACK实际工作的选项 |
kind=8 | 时间戳选项 |