通过Wireshark抓包了解TCP三次握手,可靠传输,四次挥手

TCP

定义

Transmission Control Protocol,传输控制协议,用于实现面向连接的可靠传输功能

通过Telnet(远程登录协议)来看TCP的过程:
打开Windows的cmd,输入:

Telnet route-server.ip.att.net

服务器ip地址是12.0.1.28
登录服务器

三次握手

通过Wireshark抓包可以看到TCP三次握手的过程
在这里插入图片描述

我们来看看第一个包[SYN]:在这里插入图片描述Destination Port:23:我想要访问你的23端口,Telnet用到的端口就是23端口
Source Port 即为源端口

第二个 [SYN,ACK]:
在这里插入图片描述

双击Flags位(标志位):
可以看到ACK和SYN都为1,ACK变为1的意思是OK你可以访问我的端口了,SYN从0变为1就是,哎我想要访问你的端口

这些指针的意义:
URG 紧急指针 此报文字段中有紧急数据,应尽快传送
ACK 确认指针 当ACK=1时,代表这是一个确认包
PSH 推送指针 接受到PSH=1的TCP报文,应尽快的交付给接收端的应用进程
RST 重置指针 当RST=1时,必须释放连接,并重新建立连接
SYN 同步指针 用来发起一个连接
FIN 结束指针 发送端完成发送任务,并要求释放连接

3次握手全过程:
A向B发送的第一个包SYN(同步位),“哎,我想访问你的23端口,能不能把你23端口丢给我一下”
B回复一个ACK:“可以呀,我允许你来访问我”,这个时候B的23端口已经打开了,开始计时。因为通信是双向的,与此同时,B也会发送SYN,“哎你访问我23端口,那你能不能把53229给我访问?”
A回复了一个ACK:“OK呀你也可以来访问我的端口了。”

一旦三次握手成功,两边会话正式建立。

为什么是三次握手而不是两次握手?
防止已失效的请求连接报文突然回传到B.

可靠传输

通过序列号,确认号和重传机制来保证TCP的可靠传输

Sequence number:序列号 32位 TCP链接中传输的数据流,每个字节都编上一个序号。序列号字段的值指的是本报文所发送的数据的第一个字节的序号
Acknowledgement number:确认号 32bit 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效

如果ACK=SEQ+LEN 则传输的过程很稳定,没有丢包
如果ACK<SEQ+LEN 则传输的过程中出现丢包,则需要启动数据重传机制

我们打开2个Telnet包:
在这里插入图片描述
A:
首先,它的源端口是23,也就是telnet
Seq=1,Len=15:我发送的数据从第1个开始发送,一共要发送15个字节,也就是发送1-15
Next seq number=16(我下一次要从16开始发送)那么对方如果全部收到的话会回复一个ACK为16的包
Ack=1:我希望对方发送给我的是从第1个字节开始发送

在这里插入图片描述
B:
对方(A)说他希望我从第一个字节开始发送,所以我的Seq=1
长度为6字节,所以是发送1-6,那么我下一次发送将会从7开始发送(Next Seq = 7)
ACK=16:我收到了A发送的1-15了,OK,我希望你A下一次发送给我的数据从16开始~~

例子:
SEQ=1,LEN=15,如果没丢包,那么对方返回的ACK=1+15=16,告诉发送方下一次需要从16开始发送,也就是我下一次的SEQ=16。
如果丢包了,比如返回ACK=11,则我下一次需要从11开始重传,无论后面的数据包有没有被对方收到。

四次挥手

顺便截了一个四次挥手过程,80端口为HTTP
在这里插入图片描述
1.A:我不再需要你的80服务了,麻烦你把它关掉吧 FIN=80
2.B:OK我先关掉80端口啦 ACK=80
3.B:那请你也把53426端口关掉吧 FIN=53426
4.A:OKOK ACK=53426

这就是四次挥手

当B发送了ACK以后(2),从A到B这个方向的连接就释放了,这时候TCP处于半关闭状态,也就是A已经没有数据要时发送了,但是B还可以发送给数据给A,也就是说B到A这个方向的连接并没有关闭。

每一次TCP都需要3次握手,可靠传输,4次挥手
发布了32 篇原创文章 · 获赞 7 · 访问量 2396

猜你喜欢

转载自blog.csdn.net/weixin_44901204/article/details/91351385