TCP/IP网络必备知识(四) --- TCP协议详解
这几天要辅导娃期末复习,时间不多,花了两天才学习完TCP协议的工作过程并整理笔记,敲字时手冻得发冷,但还是要坚持学习,心里才会觉得暖暖的。
一 TCP协议:
TCP(Transmission Control Protocol) 传输控制协议,对数据的传输进行一定的控制。
主要涉及TCP的三次握手和四次挥手,后面的内容详细讲解它们的交互过程。
二TCP协议的工作过程:
先举一个例子来理解TCP三次握手的过程。
例:男生向女生提出恋爱交往请求过程
男生发出请求交往消息,女生收到消息后,礼貌回应(确认ACK=1)并表示同意交往试试(SYN=1),男生收到后也向女生发送消息通知确认已经得到她的回复(ACK=1),并确认自己也想试试(SYN=1),确认完毕,正式开始交往。男女生一共发送了三次消息,也就是类似TCP的三次握手过程。
◆TCP协议头部组成结构,如下图所示:
上图中红色圈出部分是我们要重点掌握的内容。
>>序号(sequencenumber):也就是编号,TCP数据包过大,分段,比如分成10段,编号为1,2…9,10。按照顺序重组 seq == 1
>>确认号(acknowledgenumber): 存在于服务器回应消息的确认消息里,依据序号,ack(确认号)==1+seq,表示服务器期望收到它的下一个序号。
>>状态控制码(codecontrol flag): 标志位 --- 信号灯, 1---亮,0---灭,表示数据包的类型,有六种类型,我们重点理解下面四种类型:
ACK(acknowledge):确认位,=1,表示这个消息时一个确认消息
RST(RESET):重置。=1,表示这个消息释放链接。TCP连接出现错误,比如主机服务器崩溃,断开连接。请求重新建立连接。
SYN(synchronous):同步,=1,表示这个消息是:1.一个发起连接的消息 + 确认接受连接消息。
FIN(Final):终止,=1,表示发送报文结束了,释放这个连接。接下来应该进行四次挥手了。
注意:TCP三次握手连接发起前,客户端和服务器都处理Close状态。
◆TCP三次握手过程:
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(SynchronizeSequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
◆上述过程中的重要概念:
(1)未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(seq=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
(2)Backlog参数
三次握手协议表示内核为相应套接字排队的最大连接个数。SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
(3)半连接存活时间
是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
◆改进的三次握手
对于一个已经建立的连接,TCP使用改进的三次握手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下:
第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。
当我们在电脑上访问百度服务器的过程就是TCP的典型应用,虽然我们是通过http/https协议来实现,但这两个协议是基于TCP协议的:Client --- 百度server,主要是通过TCP协议建立交互和链接的前提下,通过http/https协议进行交互。
TCP协议连接请求包含TCP三次握手连接过程和TCP四次挥手断开连接过程。
细节如下:
继续举一个例子来理解TCP四次挥手的过程。
例:男生向女生提出分手的请求过程,男生女生都非常的绅士和淑女,比较容易理解。
TCP四次挥手断开连接发起前,客户端和服务器都处理连接状态。客户端发出断开连接请求后,等待服务器确认并发送关闭连接的请求,然后客户端再确认,至此四次挥手就完成了。
下图为我们关闭百度页面的过程示意图:
下面是wireshark抓包TCP三次握手的数据包情况,可以对照上面的原理来加深印象。
打开浏览器访问一个页面,抓包。
输入tcp协议进行过滤,点击第一个包分析TCP流信息,邮件点击该条报文信息,选择追踪流之TCP流。
以上重点关注传输层的内容,可对照前面所讲来分析。
接下来的图是第二次握手信息。
同样查看TCP流信息
最后是第三次握手信息
TCP四次挥手包以此方法同理可以自行分析。
注意TCP协议中的发送的每个数据包都是需要确认的。
如果理解起来依然觉得困难,可以点击下面的链接观看视频详细讲解:
https://edu.csdn.net/course/play/30776/453095