一:前言
TCP的最终目的是为数据提供可靠的端到端传输,而且TCP能够处理数据的顺序并恢复错误,并且最终保证数据能够到达目的地。
TCP被认为是面向连接的协议。因为它在传输数据之前会事先发起一个正式的连接,用来追踪数据包的传递。
当传输要结束时,它会尝试正式地关闭会话通道
很多普遍使用的应用层协议,都依赖于TCP和IP将数据包传输到最终目的地
二:TCP报头
源端口(Source Port):用来传输数据包的端口
目的端口(Destination Port):数据包将要发送的端口
序号(Sequence Number):这个数字用来表示一个TCP片段,这个域用来保证数据流中的部分没有缺失
确认号(Acknowledgement Number):这个数字是在通信中希望从另一个设备中得到的下一个数据包的序号
标志(Flags):URG ACK PSH RST SYN FIN 都用来表示所传输的TCP数据包的类型
窗口(Windows Size):TCP接受者缓冲的字节大小
校验和(Checksum):用来保证TCP头和数据的内容在抵达目的地时的完整性
紧急指针(Urgent Ponter):如果设置了URG位,则这个域将被检查作为额外的指令,告诉CPU从数据包的哪里开始读数据
选项(Options):各种可选项,可以在TCP数据包中进行指定
三:TCP端口
所有TCP通信都会使用源端口和目的端口,这些可以在TCP头中找到。
为了能够将数据传输到远程服务器或设备特定应用中去,TCP数据包必须知道远程服务所监听的端口。如果想要试着连接其他端口,那么这个通信肯定会失败
源端口并不重要,可以随机选择。远程服务器可以从发过来的原始数据包中得到这个端口
在进行TCP通信时,有65535个端口可供使用,关于端口的分类可以查看https://blog.csdn.net/qq_39112646/article/details/85722884
协议和端口相关联的文件:Wireshark系统目录下,“services”文件
四:TCP的三次握手
所有基于TCP的通信都需要从两台主机的握手开始,这个握手过程主要希望达到一些目的:
- 保证传输主机和目的主机在线并且能进行通信
- 让传输主机确定目标主机在监听传输主机试图连接的端口
- 允许传输主机向目标主机发送它的起始***,使得两台主机可以将这个会话保持有序
TCP握手分为3个步骤
第一步:主机向服务器发送了一个TCP数据包。这个数据包除了底层协议头之外不包含任何数据,这个数据包的TCP头设置了SYN标志,并包含了在通信过程中会用到的初始***和最大分段大小(MSS)。
第二步:服务器对于这个数据包恢复了一个类似的设置了SYN和ACK标志以及包含了它初始***的数据包
第三部:主机向服务器发送最后一个仅设置了ACK标志的数据包
这个过程完成之后,双方设备已经具有了开始正常通信所需要的信息
TCP数据包再称呼上通常会被其设置的标志所代表,比如设置了SYN标志的TCP数据包,称其为SYN包。
五:TCP的四次挥手
所有的问候最终都会有一句再见,在TCP中,每一个握手和终止使得连接有始有终。TCP终止用来在两台设备完成通信后正常地结束连接。这个过程包含4个数据包,并且用一个FIN标志来表名连接的终结。
第一步:在一个终止序列中,主机发送一个设置了FIN和ACK标志的TCP数据包,告诉服务器通信完成
第二步:服务器以一个ACK数据包响应
第三步:服务器响应一个FIN/ACK数据包
第四步:主机响应一个ACK数据包,然后结束通信过程
六:TCP的重置
在理想情况下,每一个连接都会以TCP终止来正常结束。但在现实中,连接经常会突然断掉。例如:一个潜在的攻击者正在进行端口扫描,或者仅仅是主机配置错误所导致。在这些情况下,就需要使用设置了RST标志的TCP数据包。
RST标志用来指出连接被异常中止,或拒绝连接请求
由于192.168.100.138没有监听80端口,故对于192.168.100.1 发起的连接请求,192.168.100.138会告诉其通信无效,发送一个RST数据包,RST数据包包含RST和ACK标志外,没有任何其他的内容
RST数据包会在尝试通信序列的开始(如上)或者在主机通信的中途,来终止通信