该文档只是记录个人学习中对TCP握手的理解,如有不对,多多担待。
我觉得TCP 三次握手就像 男女相亲.
男的发了一个消息给女的,说:你觉得咱俩合适不?
女的觉得可以呢,就又发了一个消息给男的, 说:合适,但是我有要求 ,有房有车
男的收到呢,觉得可以,就说:行
TCP 三次握手客户端服务端应答过程
首先,客户端和服务端都打开端口.此时,服务端处于监听状态.
1.客户端第一次发送报文信息,我理解为第一次握手,
其中,报文中 SYN=1, seq=x,
SYN 我个人理解是建立连接的标志,seq代表初始化序列号,个人理解为客户端给服务端发送了一个序号x。
注意:TCP协议人家规定了,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
2.服务端第一次收到报文信息后,也就是第一次握手信息后,
服务端一看,哦,SYN=1,seq=x,只有SYN,seq,代表这是TCP建立第一次握手连接
说明这是第一次握手连接。
3.服务端说我得给个回应,于是,服务端给了一个回应报文,此时,这是第二次握手。
其中,报文里,SYN=1,ACK=1,seq=y,ack=x+1 ,
好的,我们来说下,其中SYN=1,SYN咱们说过了,是建立连接的标志
ACK=1,ACK是确认序号的标志,为1时表示确认序号有效,为0时表示报文中不含序号确认信息,忽略该字段
seq=y,咱们说过了,seq是初始化序列号,那么seq=y我的理解为服务端给客户端发送了一个序号y,
ack=x+1,(注意,此时ack为小写)这个也好理解,ack是服务端给客户端的回应,说,我收到你的序号X了,我给你回应一个X+1给你,
小写ack是对客户端小写seq的回应。
注意啊,同志们,我的理解是,在报文里,大写ACK和小写ack是不一样的,大写ACK代表确认对方的序号,
小写ack代表对方传过来的序号(seq)+1.
综上所述,
客户端发送 SYN=1, seq=x
服务端回应 SYN=1,ACK=1(代表告诉客户端,你发的我收到了),seq=y(服务端的初始化序号),
ack=x+1(ack=客户端的seq+1)。
4. 客户端收到第二次握手信息后, SYN=1,ACK=1,seq=y,ack=x+1 ,
客户端一看,哦,SYN=1,握手信息,然后根据 ACK=1, ack=x+1(其中ack=客户端的seq+1),
判断出这是第二次握手信息,
其中ACK=1是服务端告诉客户端,你上次发的握手信息,我收到啦
ack=x+1,客户端用第一次的seq=x, ack-seq=1,判断出这是第一次握手的回应,也就是第二次握手
此时,客户端也要给个回应,
这是为啥呢?
因为客户端发送握手信息给服务端,服务端给回应了,
但是人家服务端给你客户端发送握手信息,你也得回应下啊?
礼尚往来,也就是说,客户端和服务端大家都得心里有底啊,
这时,客户端发送ACK=1,seq=x+1,ack=y+1,这是第三次握手,此时,客户端状态为ESTABLISHED(已建立连接)
ACK=1,代表客户端告诉服务端,你上次发的握手信息,我收到了,
seq=x+1,代表客户端说,我第一次发送的序号是x,第二次我发送的序号是x+1,seq是握手序号
ack=y+1,其实就是根据服务端发过来的seq=y,然后加1, ack=(服务端seq+1),ack是对上次握手的回应
注意:此事不需要SYN=1了,因为SYN=1是建立连接过程的标志。此时已建立连接
6.服务端收到第三次握手信息。
经过检查,ACK=1,seq=x+1,ack=y+1,哦,这是第三次握手,OK,服务端状态也设置为ESTABLISHED(已建立连接)。
以上只是我个人的理解,肯定有些地方不对,而且我文笔很差,博君一笑。
我理解的不管客户端还是服务端,当收到ACK=1,ack=自己发的序号+1后,服务端的状态改为ESTABLISHED(已建立连接)。
TCP 三次握手客户端服务端应答过程
最新推荐文章于 2023-05-09 15:59:45 发布