文章框架
握手的名词解释
三次握手原理
概括
TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”
全文按照标准输出首字母大写
名词解释
TCP报文中的两个序号
1、Seq序号:占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
2、确认序号:占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1,为了两端配对,这里可以引出TCP传输协议是可靠传输协议,为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。当应用程序在收到数据后要做出确认时也要用到TCP。
注意!
只要两端可以正常通信ACK标志位都为1,后续抓包查看握手过程会指出ACK的具体位置
这里ACK和Ack不要混淆,大写的ACK是标志位,小写的Ack是确认序号
标志位
介绍完序号后,开始介绍我们的六个标志位,三次握手四次挥手中可以看到的是ACK SYN FIN
-|-|
ACK|确认(Acknowledgement Number)栏有效,同时提示远端系统已经成功接收所有数据
SYN|发起一个新的TCP连接,该标志仅在三次握手建立TCP连接时有效
FIN|用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据
PSH|接收方应该尽快将这个报文交给应用层
RST|重置连接
URG|紧急指针(urgent pointer)有效
TCP连接及关闭状态
-|-|
LISTEN|监听来自远方TCP端口的连接请求。
SYN-SENT|在发送连接请求后等待匹配的连接请求。
SYN-RECEIVED|在收到和发送一个连接请求后等待对连接请求的确认。
ESTABLISHED|代表一个打开的连接,数据可以传送给用户。
FIN-WAIT-1|等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
FIN-WAIT-2|从远程TCP等待连接中断请求。
CLOSE-WAIT|等待从本地用户发来的连接中断请求。
CLOSING|等待远程TCP对连接中断的确认。
LAST-ACK|等待原来发向远程TCP的连接中断请求的确认。
TIME-WAIT|等待足够的时间以确保远程TCP接收到连接中断请求的确认。
CLOSED|没有任何连接状态。
三次握手原理
下图是ssh连接阿里云服务器时WireShark抓的数据
- 第一次握手
我的客户端向阿里云发送SYN请求,同时会生成Seq序号(序列号)。SYN=1,Seq=N(0)。图中的Seq为0是因为访问阿里云的数据包是第一个被抓到的(Seq随机)
SYN1、Seq=N(0) 括号中的值是图中的真实值
这时候我主机的状态是SYN-SENT(在发送连接请求后等待匹配的连接请求)
- 第二次握手
阿里云服务器一直是LISTEN(监听来自远方TCP端口的连接请求)收到了我的SYN包,同时发送SYN=1建立TCP连接,ACK=1(再次强调只有ACK=1时,Ack确认序号才有效),Ack=N+1(0+1),也会对这条消息生成一个Seq序号Y(0)
服务器发送连接请求后状态会变为SYN-RECEIVED(在收到和发送一个连接请求后等待对连接请求的确认)
SYN=1、ACK=1、Ack=N+1(0+1)、Seq=Y(0)
- 第三次握手
我的客户端收到阿里云的SYN+ACK包后回向服务器发送确认包ACK(Ack=Y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。此时就可以进行数据传输
ACK=1、Seq=N+1(0+1)、Ack=Y+1(0+1) - 附上百度的图
转载于:https://blog.51cto.com/1163739403/2373343