什么是TCP
TCP是面向连接的、可靠的、基于字节流、点到点的
传输层通信协议。它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的
特点:
1、面向连接:三次握手四次挥手
2、TCP提供可靠交付的服务
校验和
序列号保证包的有序性
超时重传快速重传
流量控制拥塞控制
3、 面向字节流
4、 TCP 是全双工
的协议
一次TCP连接中,TCP的双方在任意时刻既可以接收数据也可以发送数据
5、每一条TCP连接只能有两个端点
TCP只能提供点到点
的通信,而UDP提供一对一、多对一、一对多、多对多
等通信。
如何唯一确定一个 TCP 连接呢?
TCP 四元组可以唯一的确定一个连接
四元组:(源IP地址,源端口号,目的IP地址,目的端口号)
;
TCP报文段
TCP报文段=首部+数据部分
源端口号、目标端口号
源 IP、源端口、目标 IP、目标端口
构成了 TCP 连接的「四元组」。一个四元组可以唯一标识一个连接。目标 IP和源IP在IP报文中。
序列号(Sequence number)
序列号(Sequence number)指的是本报文段数据部分中的第一个字节的编号。序列号加上报文的长度,就可以确定传输的数据范围。TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素。
确认号ack
ack=n
表示:告知对方下一个期望接收的起始序列号为n
,说明[0,n-1]
的所有字节都已经收到。
数据偏移=首部长度
以4字节为单位。用来指出TCP报文段的数据载荷部分的起始位置.实际上指出了TCP报文段的首部长度.
保留
占6byte,保留为今后所用。目前置为0
8个标志(核心)
TCP 有很多种标记,有些用来发起连接同步初始序列号,有些用来确认数据包,还有些用来结束连接。TCP 定义了一个 8 位的字段用来表示 flags,每一个flags只占一位,取值为0或1
,如下图所示
最常见的有下面这几个:
1、SYN(Synchronize Sequence Numbers )
:同步序列号,用于握手
当SYN=1时用于发起握手,SYN数据包中包含用于同步双方的初始序列号ISN
。搭配序列号seq一起使用。
2、 ACK(Acknowledge):
ACK=1表示这是确认数据包,搭配确认号ack一起使用。
3、RST(Reset)
: 重置连接
作用:
- 用来
异常的关闭连接
,发送 RST后,发送方不必等缓冲区的数据都发送出去,直接丢弃缓冲区中的数据,释放连接进入CLOSED
状态。而接收端收到 RST后,也不需要发送 ACK 确认。 - 用来拒绝打开一个TCP连接。
常见的几种会出现 RST 的情况
1、服务器的IP存在,但是服务器并没有监听目标端口
浏览器向服务器指定端口发送 SYN 包,如果服务器回复了 SYN+ACK,说明监听端口存在,如果返回 RST,说明端口未被监听,可以用来检测端口是否打开
2、 A断电重启之后,之前建立的连接信息丢失,就会发送 RST 给B重置连接
4、 FIN(Finish):
通知对方我发完了所有数据,准备断开连接,后面我不会再发数据包给你了。
5、PSH(Push)
:
发送方不等发送缓冲区满立马发送
接收方不等接收缓冲区满立即读取数据
6、URG
:紧急标志
接收方收到该报文时会优先处理该紧急报文
窗口大小
接收窗口大小决定发送窗口大小。用于流量控制
校验和
占16byte, 检查范围包括TCP报文段的首部和数据两部份.
可选项
常用的选项有以下几个:
1、MSS:(Max Segment Size),标记TCP一段的最大长度为多少。
2、 SACK:选择确认选项,可使得发送方知道哪些数据丢失需要重新发送,而那些数据是已经收到无需发送的。
3、 Window Scale:窗口缩放选项,控制窗口大小
4、Timestamps Option(时间戳):
填充
因为首部长度字段, 是以4字节为单位的, 因此使用填充来确保报文段首部能被4整除