TCP(Transmission Control Protocol, 传输控制协议)
TCP协议: 在IP协议之上,解决网络通讯可依赖问题
TCP: 面向连接的, 可靠的, 基于字节流的传输层通信协议.
面向连接: 一对一的,点对点的连接. 是指使用TCP的两个应用程序必须在他们可交换数据之前, 通过相互联系 (三次握手)来建立一个TCP连接
可靠的: TCP能保证一个报文最终都能到达接收端
基于字节流: 表示我们的消息是没有边界的, 无论消息有多大, 都可以进行传输. 其次, 基于字节流是一个有序的,当前一个字节接收端没有收到的话, 先收到了后一个字节, 也不能传输给应用程序处理
TCP所解决的问题:如何把一个报文 按照顺序, 可靠的发送给对端.
TCP的以上功能都是通过TCP头部实现的, 接下来看看TCP头部的内容.
TCP头部
上图为TCP报文段.在不带选项的情况下, 大小为20字节. 如果帯上选项的话, 最大可达到60字节.
字段 | 作用 |
---|---|
源端口和目的端口 | 源端口和目的端口和源IP和目的IP组成一个四元组. 唯一的表示了每一个连接 |
序列号 | 标识了TCP发送端到TCP接收端的数据流的一个字节,该字节代表着该序列号的报文段的数据中的第一个字节 |
确认号(ACK) | 该确认号的发送方期待接受下一个序列号 |
头部长度 | TCP头部的长度, 以32位字为单位.因为选项字段的长度不定, 所以需要指名这个头部的大小 |
CWR | 拥塞窗口减(发送方降低它的发送速率) |
ECE | ECN回显(发送发接收到了一个更早的拥塞通告) |
URG | 紧急(紧急指针字段有效) |
ACK | 确认(确认号字段有效, 连接建立以后一般都是启用状态) |
PSH | 推送(接收方应该尽快给应用程序传送这个数据) |
RST | 重置连接(连接取消,经常是因为错误) |
SYN | 用于初始化一个连接同步序列号 |
FIN | 该报文段的发送方已经结束向对方发送数据 |
TCP校验和 | 这个字段是强制的,由发送方进行计算和保存, 然后由接收方验证 |
紧急指针 | 只有URG位字段被设置时才有效.这个指针是一个必须要加到报文段的序列号字段上的正偏移 |
TCP协议的主要任务
- 主机内的进程寻址 --基于端口
- 创建, 管理, 终止连接
- 处理并将字节(8 bit)流打包成报文段(segment)
- 传输数据
- 保持可靠性与传输质量
- 流量控制与拥塞控制
- 流量控制: 面向于接收方和发送方两端, 防止两端处理数据不匹配
- 拥塞控制: 面向与整个网络, 防止网络出现恶性拥塞
TCP的可靠性的保证
-
在TCP层中, TCP把应用程序的数据分散为TCP认为最佳大小的segment来发送. 有TCP传给IP的segment被称为报文段.
-
TCP的校验和字段: 它用于检测传送中引入的比特差错, 如果一个帯无效校验和的报文段到达, 那么TCP会丢失它, 并且不发送ACK确认号, 使这个错误的包重新传送.
-
重传计时器: TCP会为一组数据设置一个计时器, 发送一个窗口的数据 被称为 一组. 如果有一个确认没有及时收到, 这个报文段就会被重传.
-
序列号: 一个TCP接收端可丢弃重复的报文段和记录以杂乱次序到达的报文段. 因为TCP使用IP来传递它的报文段, IP不提供消除或保证次序正确的功能. 但是, TCP是一个字节流协议, TCP绝不会以杂乱的次序给接收应用程序发送数据. 所以, TCP接收端可能会先保持大序列号的数据不交给应用程序, 直到确实的小序列号的报文段到达.