请选择 进入手机版 | 继续访问电脑版

HTML5星空

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

[复制链接]
发表于 2020-6-28 22:40:11 | 显示全部楼层 |阅读模式

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

    1. 掌握TCP连接过程

    2. 学会计算seq、ack码


TCP 协议是HTTP协议的重要基础,充分理解TCP协议的连接及端口,有助于我们深入理解网络请求和连接。


 OSI  7层网络模型

OSI是 

 Open System Interconnetion 的缩写,国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。


1. 传输层

接受上一次的数据,将数据进行分割,保证数据准确到达对端。


2. TCP

TCP是面向连接的无状态的协议。为了连接的可靠性,每次连接的建立都需要3次握手。


2.1 建立连接(3次握手)

3次握手的目的:

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

2. 交换TCP窗口大小信息。

第一次握手: 建立连接。客户端发送连接请求,发送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 数据传输

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


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


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


2.3 断开链接(4次挥手)

第一次挥手:客户端向服务器发送一个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://segmentfault.com/a/1190000014213178


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多资源及Java+大数据个人原创视频,
可关注本站官方公众号观看:
快讯

     京ICP备14042305号

html5star team © 2012-2013 html5星空 Comsenz Inc.

GMT+8, 2020-7-12 04:53 , Processed in 0.263836 second(s), 38 queries .

快速回复 返回顶部 返回列表