什么是TCP
TCP是一种可靠的端到端的传输层协议,仅应用于单波通信。
采用TCP协议作为传输方式的应用层服务,再进行数据传输前,都需要进行TCP协议的创建。
TCP报文的格式
sequence number(序列号)
占4个字节,32比特,序列号是指报文里面data数据中第一个字节的编号。
acknowlegment number(确认号)
该字段指的是,希望接受对端下一个数据段的序列号。
header length(头部长度)
这个字段以4个字节为单位来标示TCP
ACK(确认)
标志位,判断确认号字段是否有效,1标示有效。
SYN(同步)
也是一个标志位,用来向对方请求建立TCP连接,对端要是也同意建立回回复一个SYN+ACK=1的确认数据段。
FIN(最后)
也是一个标志位,用来请求对方释放TCP连接,标示没有数据要发送了。
实验配置
第一步配置环境
配置环境的流程和这个一模一样,华为hcia——Datacom实验指南——以太网帧和IPV4数据包格式(一),再配置完成后,我们还需要的操作是,在桌面建立一个文件夹,里面随便放一个.html网页的文件。
启动服务。
第二步对数据进行抓包
随便选择一个地方进行抓包
第三步,访问服务器
我们之前配置的服务器ip是192.168.2.10,html服务端口是80,所以我们访问的网站是
http://192.168.2.10:80
当我们配置正确,点击获取后是这样的
分析
TCP协议分为2部分,建立服务,由3次握手组成,释放服务由4次挥手。
在我们抓获的这个流量包中,可以很明显的看到3次握手和四次挥手。
我们分别进行分析
三次握手
第一次握手
客户端向服务器发送一个SYN=1的报文。
我们重点关注几个地方
第一个是sequence number,
一个是0还有一个是6659,之所以有两个,是因为,在wireshark中,为了方便用户好判断,所以默认是0,但是实际上,这个值是下面这个6659,这个数值是随机的。
第二个是acknowledgment nubmber,
因为这是第一次握手,所以不存在需要确认的地方,默认为0
第三个是flags字段
在flags字段里面我们看到只有syn=1,可以判断出这是第一次握手。
第二次握手
还是和第一次握手关注的一样
第一个是sequence number,
一个是0还有一个是42012,之所以有两个,是因为,在wireshark中,为了方便用户好判断,所以默认是0,但是实际上,这个值是下面这个42012,这个数值是随机的。
在这里,这个seq的值也是随机的,且这个值是服务器这边随机的初始值。
第二个是acknowledgment nubmber,
这是第二次握手,所以ack的值是第一握手中seq值加一。
第三个是flags字段
在flags字段里面我们看到syn=1和ack=1
可以判断出这是第二次握手。
第三次握手
第一个是sequence number,
有两个值一个是1,一个是6660,这是在第一次握手的基础上序列号加一
第二个是acknowledgment nubmber,
它的值是1,这是在上一个报文的seq值加一的出来的
第三个是flags字段
在flags字段里面我们看到ack和seq值=1
可以判断出这是第三次握手,也是最后一次握手
说完三次握手,接下来分析一下四次挥手
四次挥手
挥手和握手有一个小区别,在客户端接受完所有数据后,会向服务器发送一个ack标签的报文,告诉服务器,我已经接受完毕了。
这里的seq和ack的值和中间发送数据相关联
第一次挥手
客户端发送一个带有FIN和ack=1的标签报文给服务器,告诉服务器我想要释放TCP协议
第一个是sequence number,
有两个值一个是159,一个是6818,和上一个ack报文的值是一模一样
第二个是acknowledgment nubmber,
它的值是308和上一个ack报文的值也是一模一样
第三个是flags字段
在flags字段里面我们看到ack和FIN的值为1
第二次挥手
服务器会回复一个ack报文,告诉客户端,我同意你的释放TCP请求
第一个是sequence number,
有两个值一个是308,一个是42320,这是在上个客户端向服务器发送释放TCP协议的ack值
第二个是acknowledgment nubmber,
这是在上个客户端向服务器发送释放TCP协议的seq+1的值为160
第三个是flags字段
在flags字段里面我们看到ack和的值为1
第三次挥手
服务器发送一个带有FIN和ack=1的标签报文给客户端,告诉服务器我想要释放TCP协议
第一个是sequence number,
有两个值一个是308,一个是42210,是上一个报文的seq+1值
第二个是acknowledgment nubmber,
它的值是160和上一个ack报文的值也是一模一样
第三个是flags字段
在flags字段里面我们看到ack和FIN的值为1
第四次挥手
客户端会回复一个ack报文,告诉服务器,我同意你的释放TCP请求
第一个是sequence number,
有两个值一个是160,一个是6819,这是在上个客户端向服务器发送释放TCP协议的ack值
第二个是acknowledgment nubmber,
这是在上个客户端向服务器发送释放TCP协议的seq+1的值为309
第三个是flags字段
在flags字段里面我们看到ack和的值为1
结束
这就是完整的TCP协议的三次握手和四次挥手的所有细节。