TCP(Transmission Control Protocol)传输控制协议
IP是无连接的,忽略网络上存在的一些问题,TCP提供可靠的面向连接的通信,负责控制连接的建立、断开、保持等管理工作
- 首部格式
- 连接
1 首部格式
没有表示包长度和数据长度的字段,可由IP层获知TCP的包长度,由TCP包长度可计算数据的长度
序列号:发送数据的位置
,每发送一次,就累加
一次该数据字节数
的大小
- 在
建立连接
时由计算机生成的随机数
作为其初始值
,通过SYN包传递
给接收端主机 - 将每转发过去的字节数累加到初始值上表示数据的位置
- 在建立连接和断开连接时发送的SYN包和FIN包
不携带数据
,但也会作为一个字节数增加
对应的序列号
确认应答号:下一次
应该收到的序列号
- 指已收到确认应答号前一位为止的数据
发送端收到
这个确认应答以后可以确认
在这个序号以前的数据都已经被正常接收
了
数据偏移:类似于IPv4数据报中的首部长度
,单位为4字节,无可选项式值为5
,表示20字节
保留:为以后扩展时使用,一般设置为0
控制位
:8位,从左至右:CWR、ECE、URG、ACK
、PSH、RST、SYN
、FIN
- CWR:通知对方已将
拥塞窗口缩小
ECE:通知对方这边
网络有拥塞
CWR与ECE都用于IP首部的ECN字段
- URG:表示包中有需要
紧急处理
的数据 ACK
:确认应答的字段变为有效除了最初建立连接时的SYN包之外,该位必须设置为1
- PSH:将收到的数据
立即
传给上层应用协议 - RST:TCP
连接
中出现异常
,必须强制断开连接
SYN
:用于建立连接SYN为1时表示希望建立连接,并在其序列号的字段进行
序列号初始值设定
FIN
:为1时表示今后不再有数据发送,希望断开连接
通信双方可以互相
交换FIN位置为1的TCP段
请求断开连接
双方又对对方的FIN包进行确认应答
以后就可以断开连接
主机在接收到FIN为1的TCP段后不会马上回复
一个FIN包,等缓冲区
所有数据都因成功发送
而自动删除后再发
窗口大小:通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小
TCP不允许发送超过窗口大小的数据,窗口为0时,可以发送窗口探测,了解最新窗口大小
校验和:使用TCP伪首部
进行校验和计算,确认收到的数据是正确的
- TCP伪首部:32位源IP地址 32位目标IP地址 填充 协议号 TCP包长度
- 首先
置0
,以16位进行1的补码和计算
,再将它们总和的1的补码和放入校验和字段 - 校验和字段保存着除本字段以外其他部分的和的补码值
- 因此在计算校验和字段在内的所有字段的16位和之后得到
16位全为1
,说明收到的数据是正确的
紧急指针:本报文段中紧急数据的指针
从数据部分的首位
到紧急指针
所指示的位置为止,这个区间为紧急数据
选项:用于提高TCP的传输性能
,最大40字节
- 在建立连接时决定最大段长度
- 窗口扩大
- 高速通信中对序列号的管理
- 选择确认应答
2 连接
- 连接可靠性
- 建立与断开
2.1 连接可靠性
通过序列号与确认应答提高可靠性
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,该消息成为确认应答
(ACK)
一定时间内没有等到确认应答:发送端可以认为数据已经丢失,进行重发
即使产生丢包,任然能够保证数据能够到达对端,实现可靠传输
返回数据丢失:这样也会导致发送端没有收到确认应答,进行重新发送
确认应答延迟到达:会导致发送端多次请求然后收到重复的数据包
需要一种机制,能识别已经接收数据,又能够判断是否需要接收 - 通过序列号实现
序列号+确认应答:接收端查询接收数据TCP首部中的序列号和数据长度,将自己下一步应该接收的序列号作为确认应答返送回去
TCP通过序列号和确认应答号实现可靠传输
重发的时间间隔以往返时间与偏差值的和为基准,是不断变换的,多次重发无确认应答会断开连接
2.2 建立连接与断开
TCP建立连接需要3次
往返消息,断开连接需要4次
往返消息
也称为TCP的3次握手与4次握手
建立连接
- 客户端->服务端:发送
SYN
包请求建立连接 - 客户端<-服务端:针对SYN确认应答
ACK
,并发送SYN
包请求连接 客户端->服务端:针对SYN确认应答
ACK
在建立连接的过程中可以确认发送数据包的单位 - 正好是IP中不会被分片处理的最大数据长度
建立连接后TCP以段为单位,每发一个段进行一次确认应答的处理,这样会导致网络性能下降
使用缓冲区实现窗口
:确认应答不再以每个分段,而是更大的单位进行确认,不用等待确认
可继续发送
- 窗口大小:无需等待确认应答而可以继续发送数据的最大值
缓冲区:临时保存收发数据的场所
之前是发
一个等一个
,现在是发一串等一串
重发控制
数据段丢失:接收端发送其他报文段时,会接收该报文
连续相同的确认应答
当超过3次重复应答时,确认报文段丢失,重新发送该报文段
断开连接
- 客户端->服务端:发送
FIN
包请求断开连接 客户端<-服务端:针对FIN的确认应答
ACK
等待缓存区数据发送完毕
- 客户端<-服务端:发送
FIN
包请求断开连接 - 客户端->服务端:针对FIN的确认应答
ACK
一个连接的建立与断开,正常过程至少需要来发送7个包才能完成
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。