tcp协议详解
Quote
TCP(Transmission Control Protocol:传输控制协议)
TCP协议是计算机网络中非常复杂的一个协议
TCP所处的位置
从结构上讲,TCP协议跟UDP协议都是一样的,都是由首部、数据报组成的。
TCP的特点
- TCP是面向连接的协议
- 面向连接:TCP要是通信的话,首先要建立连接
- TCP的一个连接有两端(点对点通信)
- TCP提供可靠的传输服务
- TCP协议提供全双工的通信
- 全双工:双方都可以同时发送和接收信息。例如:网线、网络都是使用全双工通信信道的
-
TCP是面向字节流的协议
Warning
UDP面向的数据报与TCP面向的字节流有什么区别呢?
字节流的流表示流入进程或流出进程的字节序列,我们知道传输层的数据都是由应用层传输下来的,它是一块一块的,但是在TCP协议中不把它看做一块一块的数据,而是把它看成一系列的一整串的字节流(如下图),在这里面TCP不是面向一整块数据来处理的,而是面向字节 一个字节一个字节来处理的。 所以在TCP协议里面就可能取出数据里的某一段来进行传输(如下图),把剩下的放在第二个TCP报文进行传输。这就是TCP面向字节流协议的原因。也因此,在TCP中可能会对用户的数据进行合并也可能会进行分拆,以把他更好的传输出去,这也是TCP的一个特点。
TCP的首部
- 序号
- 大小:占32个比特位,可表示的范围是
0 ~ 2^32-1
的范围 - 释义:TCP是面向字节流的,因此每一个字节都会有一个序号,而这个序号就是来标记传输的每一个字节的。一个字节就会有一个序号。这里面的序号代表的是这一个TCP报文它所传输数据的第一个字节序号是什么(如下图,含义是为了合并)。与之对应的就是确认号。
- 大小:占32个比特位,可表示的范围是
-
确认号
- 大小:占32个比特位,可表示的范围是
0 ~ 2^32-1
的范围 - 释义:同序号,一个字节一个序号,这里面的确认号它主要是用于表达期望收到数据的首字节序号(如下图)。当前报文的序号是501,已知数据报总长是100,故确认号应为601(下次报文应该传输的序号)
Quote
序号与确认号小结:序号与确认号属于相辅相成。确认号为N,则表示N - 1序号的数据都已经收到。
- 大小:占32个比特位,可表示的范围是
-
数据偏移
- 大小:占4位 0 ~ 15,单位为:32位字(每一个偏移都能表示4个字节的偏移)
- 释义:真实的TCP数据偏离首部的距离,这个是由于 TCP选项(可选)、填充 块导致的。已知TCP首部的长度在排除TCP选项后为20个字节,但是如果存在TCP选项之后会导致数据偏离首部距离,具体能偏离的范围取决于数据偏移的范围(0~15, 4个字节),所以TCP首部等于15 * 4 = 60字节。故TCP首部长度为20~60字节
- TCP标记
- 大小:占6位,每位各有不同意义
- URG:Urgent 紧急位,URG = 1,表示紧急数据
- ACK:Acknowledgement 确认位,ACK = 1,确认号才生效
- PSH:Push 推送位,PSH = 1,尽快的把数据交付给应用层
- RST:Reset 重置位,RST = 1,重新建立连接
- SYN:Synchronization 同步位,SYN = 1 表示连接请求报文
- FIN:Finish 终止位,FIN = 1 表示释放连接
- 大小:占6位,每位各有不同意义
- 窗口
- 大小:占16位,0 ~ 2^16 - 1
- 释义:窗口指明允许对方发送的数据量有多少。如果指明1000,则表示对方可以发送1000个字节给我。也可以把窗口结合确认号来计算,举例说明:比如目前的确认号是501,这个时候窗口的值是1000,那么也就是501~1500这么多个字节的数量都是可以接收的,这就是窗口的意思
- 紧急指针
- 释义:紧急数据(当URG = 1的时候才会启用),表示的是紧急数据位于报文的位置。对于TCP报文来说有部分的紧急数据是可以保存在数据报里面的,到达对方的时候对方则可以知晓紧急数据所处的位置
- TCP选项(可选)
- 大小:最多40个字节
- 释义:目的是为了支持未来的拓展
TCP的定时器
- 超时定时器:超时重传机制定时器
- 坚持定时器:解决死锁局面的,比如接收方发送给发送方一个窗口数据,但是数据未送达至发送方,导致接受方和发送当都处于等待状态(死锁)
- 当接收方收到窗口为0的消息,则启动坚持定时器
- 坚持定时器每隔一段时间发送一个窗口探测报文
- 等待定时器