1 TCP协议基本概念(RFCs-793, 1122, 1323, 2018, 2581)
1.1 TCP协议的特点
- 点对点
- 可靠的、按序的字节流
- 可靠的:多种确保可靠性的机制
- 字节流服务:8bit(1Byte)为最小单位构成的字节流
- 流水线机制
- 发送方/接收方缓存
- 全双工(full-duplex)
- 面向连接
- 通信双方在发送数据之前必须建立连接
- 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
- TCP连接包括:两台主机上的缓存、连接状态变量、socket等
- 流量控制机制
![这里写图片描述](https://img-blog.csdn.net/20171015193645808?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1.2 套接字地址
- TCP使用“连接”(而不仅仅是“端口”)作为最基本的抽象,同时将TCP连接的端点称为插口(socket),或套接字、套接口。
- 插口和端口、IP地址的关系是:
1.3 TCP发送缓存、接收缓存及报文段简要示意图
![这里写图片描述](https://img-blog.csdn.net/20170605084511318?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170605084608634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170605084646416?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
- TCP发送进程以字节流的形式传递数据,而接收进程也把数据作为字节流来接收,类似于假想的管道。UDP发送进程发送的数据报文都是独立的,因此UDP协议不是面向流的协议。
- 缓存:数据流向的每一个方向上都有发送缓存和接收缓存两种缓存。
- 在传输层向IP层发送数据时,要以分组为单位,而不是按字节流来发送,TCP协议把若干字节构成一个分组,我们可以把这样的分组称为报文段(segment),这种报文段不一定都一样长,可以几个字节,也可以是几千个字节。
1.4 字节号和序号
字节号
- 以字节为单位
- 字节号的定义范围为0~(2^32-1)
- 编号机制:随机
- 举例:假如随机号是1057,而要发送6000个字节,那么字节编号范围为1057~7056。
序号
- 以字节为基础,TCP给每一个报文段指派一个序号
- 每个报文段的序号就是在这个报文段中第一个字节数据的序号
- 举例:比如TCP要传输6000个字节的文件,第一个字节的编号是10001,如果数据用5个报文段来发送,前4个报文段各携带1000字节的数据,最后一个报文段携带2000字节的数据。则各报文段序号如下:
- 报文段1->序号:10001(字节号范围:10001~11000)
- 报文段1->序号:11001(字节号范围:11001~12000)
- 报文段1->序号:12001(字节号范围:12001~13000)
- 报文段1->序号:13001(字节号范围:13001~14000)
- 报文段1->序号:14001(字节号范围:14001~16000)
1.5 接收方如何处理乱序到达的Segment?
TCP规范中没有规定,由TCP的实现者做出决策。
2 TCP协议报文段格式
![这里写图片描述](https://img-blog.csdn.net/20170623064007850?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20171015193751293?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
源端口和目的端口
- 源端口和目的端口各占2字节
- 端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现
- 源端口一般为动态端口
序号字段
- 序号字段占4字节
- TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一字节的序号
- 序列号指的是segment中第一个字节的编号,而不是segment的编号
- 建立TCP连接时,双方随机选择序列号
确认号字段
- 确认号占4字节
- 是期望收到对方的下一个报文段的数据的第一个字节的序号
- 累计确认:该序列号之前的所有字节均已被正确接收到
首部长度
- 首部长度占4bit
- 它指出TCP首部共有多少个4字节,首部长度可以在20~60字节之间。因此这个字段的值可以在5(5X4=20)至15(15X4=60)之间
保留字段
- 保留字段占6bit
- 保留为今后使用,但目前应置为0
紧急比特URG
- 紧急比特URG占1bit
- 当URG=1时,表明紧急指针字段有效
- 它高速系统此报文段中有紧急数据,应当尽快传送(相当于高优先级的数据)
确认比特ACK
- 确认比特ACK占1bit
- 只有当ACK为1时确认号字段才有效。当ACK=0时,确认号无效
推送比特PSH(Push)
- 推送比特PSH占1比特
- 接收TCP收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付
复位比特RST(Reset)
- 复位比特RST占1比特
- 当RST=1时,表明TCP连接中出现严重差错(如拒绝连接请求、异常中止连接、中止空闲连接等),必须释放连接,然后再重新建立运输连接
同步比特SYN
- 同步比特SYN占1比特
- 同步比特SYN置1,就表示这是一个连接请求或连接接收报文
终止比特FIN(Final)
- 终止比特FIN占1比特
- 用来释放一个连接。当FIN=1时,表明此报文段地发送端地数据已经发送完毕,并要求释放运输连接
窗口字段
- 窗口字段占2个字节
- 窗口字段用来控制对方发送地数据量,单位为字节
- TCP连接地一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限
校验和
- 校验和占2字节
- 校验和字段检验的范围包括首部和数据这两部分
- 在计算校验和时,要在TCP报文段的前面加上12字节的伪首部(IP地址)
紧急指针字段
- 紧急指针字段占16bit
- 紧急指针字段指出在本报中的紧急数据的最后一个字节的序号
选项
- 选项字段长度可变,但不超过40个字节
- TCP只规定了一种选项,即最大报文段长度:MSS(Maximum Segment Size)。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”
- MSS是TCP报文段中的数据字段的最大长度
- 数据字段加上TCP首部才等于整个的TCP报文段
填充
TCP报文抓包举例
![这里写图片描述](https://img-blog.csdn.net/20170623090444657?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3 TCP三次握手和四次释放过程
用三次握手建立TCP连接
![这里写图片描述](https://img-blog.csdn.net/20170623173810868?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
TCP连接释放的过程
![这里写图片描述](https://img-blog.csdn.net/20170623173734653?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在第二次释放后,从 A 到 B 的连接就释放了,连接处于半关闭状态。相当于 A 向 B 说:“我已经没有数据要发送了。但你如果还发送数据,我仍接收。”
在第四次释放后,整个连接已经全部释放。
![这里写图片描述](https://img-blog.csdn.net/20170623180320333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4 TCP确认机制
![这里写图片描述](https://img-blog.csdn.net/20170623182232175?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
5 TCP窗口机制
![这里写图片描述](https://img-blog.csdn.net/20170623182840976?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAyMzM4Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
修改记录
参考资料
深博 — 深博IT大讲堂 — 网络技术基础