TCP协议详解(一) TCP服务的特点和TCP头部结构
从重点内容四方面来讨论TCP协议:
1:TCP头部信息。TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口号、目的端端口号、管理TCP连接,控制两个方向的数据流。
2:TCP状态转移过程。TCP连接的任意一端都是一个状态机。在TCP连接从建立到断开整个过程中,连接两端的状态机将经历不同的状态变迁。
3:TCP数据流 通过分析TCP数据流,我们就可以从网络应用程序外部来了解应用层协议和通信双方交换的应用程序数据。将讨论两种类型的TCP数据流:交互数据流 和 成块数据流 TCP数据流中有一种特殊的数据,称为紧急数据。
4:TCP数据流的控制 为了保证可靠传输和提高网络传输质量,内核需要对TCP数据流进行控制。这一部分将讨论TCP数据流控制的两个方面:超时重传和拥塞控制
TCP服务的特点
传输层协议主要有两个:TCP协议和UDP协议。TCP相对与UDP协议的特点是:面向连接、字节流和可靠传输
面向连接 : TCP协议的这种连接是1对1的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。而无连接协议UDP则非常适合广播和多播。还有我觉得:面向连接,我的理解是 双方都在内核维护了一些状态。
字节流服务 : 字节流服务和数据报服务的主要区别对应到实际编程中,则体现为通信双方是否必须执行相同次数的读、写操作(表现形式)。
例如: 当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲中,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文发出。因此TCP模块发送出的TCP报文段的个数和应用程序执行写操作次数之间没有固定的数量关系。 同理,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间没有固定的数量关系
TCP传输是可靠的 TCP协议采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为TCP报文段传输成功。其次,TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段。最后,因为TCP报文段最终是以IP数据报发送的,而IP数据报达到接收端可能乱序、重复,所以TCP协议还会对收到的TCP报文进行重排、整理、在交付给应用层。
IP头部结构
TCP头部结构
这些字段代表的意义都可以在课本上找到,我们抓取一个tcp报文进行分析。
在一个客户端监听环回端口,然后在另外一个端口使用telnet登陆。
分析抓取到的第一个tcp报文。
首先分析前20个字节(IP头部):
十六进制数 | 十进制数 | IP头部信息 |
---|---|---|
0x4 | 4 | IP版本号 |
0x5 | 5 | 头部长度为5个32bit即20字节 |
0x10 | TOS选项中最小延时服务被开始 | |
0x003c | 60 | 数据报总长度为60 |
0xdc94 | 16位标识 | |
0x4 | 设置了禁止分片的标识 | |
0x000 | 0 | 分片位移(因为第一个报文所以偏移为0) |
0x40 | 64 | TTL值为64,则生存周期为64 |
0x06 | 6 | 协议字段为6,表示上层协议为TCP协议 |
0x6015 | IP头部校验和 | |
0x7f000001 | 源端IP地址为127.0.0.1 | |
0x7f000001 | 目的端IP地址为127.0.0.1 |
然后分析后面20个字节
十六进制数 | 十进制数 | IP头部信息 |
---|---|---|
0xbf74 | 49012 | 源端口号 |
0x0017 | 21 | 目的端口号 |
0xc311b84e | 3272718414 | 32位序号 |
0x00000000 | 0 | 确认号 |
0xa | 10 | 4位头部长度(头部长度为40个字节) |
0xaaaa | 43960 | 接收通告窗口大小 |
0xfe30 | 头部校验和(不仅包括头部还包括数据部分) | |
0x0000 | 没设置URG标识,所以紧急指针无意义 | |
0x0204 | 最大报文段长度选项的kind值和length值 | |
0xffd7 | 65495(65535-40) | 最大报文长度 |
0x0402 | 允许SACK选项 | |
0x080a | 时间戳选项的kind值和length值 | |
0x54cefb4b | 1422850891 | 时间戳 |
0x00000000 | 0 | 回应时间戳 |
0x01 | 空操作选项 | |
0x0303 | 窗口扩大因子的kind和length值 | |
0x07 | 7 | 窗口扩大因为为7 |
下一节将介绍TCP连接的建立和关闭。、