资讯专栏INFORMATION COLUMN

看图理解TCP的三次握手和四次挥手

gotham / 1487人阅读

摘要:建立连接次握手次握手的目的同步连接双方的序列号和确认号交换窗口大小信息。客户端状态建立连接三次握手服务端状态第一次握手建立连接。计算规则为序列号为应答码对方上次的首次发送时为系统随机生成对方的无数据传输时或者报文数据的长度

阅读时间:8min
阅读目标:

掌握TCP连接过程

学会计算seq、ack码

TCP 协议是HTTP协议的重要基础,充分理解TCP协议的连接及端口,有助于我们深入理解网络请求和连接。今天就来看图学习TCP请求的连接、数据传输及端口连接。

OSI7层网络模型
OSI是Open System Interconnection的缩写,国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。
参考模型(从上至下) 各层含义
应用层 为应用程序提供服务,如HTTP、FTP、SMTP、POP3等
表示层 数据格式转换翻译、数据加密解密、压缩解压缩
会话层 不同机器之间的用户建立及管理会话
传输层 建立管理和维护端到端的连接,TCP、UDP
网络层 IP地址及路由选择
数据链路层 物理寻址,将原始比特流转化为逻辑传输线路
物理层 机械、电子、定时接口通信信道上上的原始比特流传输
1. 传输层
接受上一次的数据,将数据进行分割,保证数据准确到达对端。
2. TCP
TCP是面向连接的无状态的协议。为了连接的可靠性,每次连接的建立都需要3次握手。
2.1 建立连接(3次握手)

3次握手的目的:

同步连接双方的序列号和确认号;

交换TCP窗口大小信息。

客户端(状态) 建立连接(三次握手) 服务端(状态)
CLOSED LISTEN
SYN seq=0 ==》
SYN_SENT
《== SYN ACK ack=1,seq=0
SYN_RCVD
ACK ack=1,seq=1 ==》
ESTABLISHED ESTABLISHED

第一次握手: 建立连接。客户端发送连接请求,发送SYN报文,随机生成seq,本例默认为0。然后,客户端进入SYN_SEND状态,等待服务器的确认。

第二次握手: 服务器收到客户端的SYN报文段。需要对这个SYN报文段进行确认,发送ACK报文,将ack设置为1(ack值为对方seq+1或者seq+L(数据长度L))。同时,自己还要发送SYN请求信息,将seq为0。服务器端将上述所有信息一并发送给客户端,此时服务器进入SYN_RECV状态。

第三次握手: 客户端收到服务器的ACK和SYN报文后,进行确认,然后将ack设置为1,seq设置为1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

2.2 数据传输
客户端 数据传输 服务端
PSH seq=1, ACK ack=1(segmentLen = 99) ==》
《== PSH seq=1, ACK ack=100 (segmentLen = 119)
ACK ack=120,seq=100 ==》

客户端先向服务器发送数据,该数据报是长度为99的数据。

服务器收到报文后, 也向客户端发送了一个数据进行确认(ACK),并且返回客户端要请求的数据,数据的长度为111,将seq设置为1,ack设置为120(1 + 119)。

客户端收到服务器返回的数据后进行确认(ACK),将seq设置为100, ack设置为112(1 + 111)。

2.3 断开链接(4次挥手)
客户端(状态) 断开连接 服务端(状态)
FIN ACK ack=120,seq=100 ==》
FIN_WAIT_1
《== ACK ack=101,seq=120
FIN_WAIT_2 CLOSE_WAIT
《== ACK ack=101,seq=120
LAST_ACK
ACK ack=121,seq=101 ==》
TIME_WAIT CLOSE

第一次挥手:客户端向服务器发送一个FIN报文段,将设置seq为100和ack为120,;此时,客户端进入 FIN_WAIT_1状态,这表示客户端没有数据要发送服务器了,请求关闭连接;

第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,ack设置为101,seq设置为120;服务器进入了CLOSE_WAIT状态,客户端收到服务器返回的ACK报文后,进入FIN_WAIT_2状态;

第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送FIN报文;如果没有,那么服务器直接发送FIN报文给客户端。请求关闭连接,同时服务器进入LAST_ACK状态;

第四次挥手:客户端收到服务器发送的FIN报文段,向服务器发送ACK报文段,将seq设置为101,将ack设置为121,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文段以后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明Server端已正常关闭,客户端也可以关闭连接了。

 计算规则: 
seq 为序列号
ack 为应答码
seq = 对方上次的ack;(首次发送时seq为系统随机生成)
ack = 对方的seq+1(无数据传输时) 或者 seq+L(报文数据的长度L)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94010.html

相关文章

  • 浅谈Http协议(五):基于Tcp协议三次握手四次挥手

    摘要:很多人都知道协议是基于协议创造出来的采用文本方式传输非二进制传输的应用层协议,协议是传输层协议,主要解决数据如何在网络中传输,而应用层协议,主要解决如何包装和规范数据。你也可以自己定义应用层协议,只不过所有配套的东西都要自己重新造轮子。 从问题切入能帮我们更好地理解晦涩难懂的概念。很多人都知道http协议是基于Tcp协议创造出来的采用文本方式传输(非二进制传输)的应用层协议,TPC/I...

    weknow619 评论0 收藏0
  • 浅谈Http协议(五):基于Tcp协议三次握手四次挥手

    摘要:很多人都知道协议是基于协议创造出来的采用文本方式传输非二进制传输的应用层协议,协议是传输层协议,主要解决数据如何在网络中传输,而应用层协议,主要解决如何包装和规范数据。你也可以自己定义应用层协议,只不过所有配套的东西都要自己重新造轮子。 从问题切入能帮我们更好地理解晦涩难懂的概念。很多人都知道http协议是基于Tcp协议创造出来的采用文本方式传输(非二进制传输)的应用层协议,TPC/I...

    TNFE 评论0 收藏0
  • 漫画:一招学会TCP三次握手四次挥手

    摘要:三次握手和四次挥手的问题在面试中是最为常见的考点之一。上面有一个非常特殊的状态,它是主动关闭的一方在回复完对方的挥手后进入的一个长期状态,这个状态标准的持续时间是分钟,分钟后才会进入到状态,释放套接字资源。 showImg(https://segmentfault.com/img/remote/1460000018918991); TCP三次握手和四次挥手的问题在面试中是最为常见的考点...

    LuDongWei 评论0 收藏0

发表评论

0条评论

gotham

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<