Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TCP三次握手/四次挥手

TCP三次握手/四次挥手

作者头像
阳光岛主
发布于 2019-02-19 09:38:36
发布于 2019-02-19 09:38:36
4720
举报
文章被收录于专栏:米扑专栏米扑专栏

TCP 三次握手

TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:

1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。

2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。

3. .客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。

TCP 使用类似的握手过程来结束连接。这可确保两个主机均能完成传输并确保所有的数据均得以接收

TCP Client

Flags

TCP Server

1 Send SYN (seq=x)

----SYN--->

SYN Received

2 SYN/ACK Received

<--SYN/ACK--

Send SYN (seq=y), ACK (x+1)

3 Send ACK (y+1)

----ACK--->

ACK Received, Connection Established

w: ISN (Initial Sequence Number) of the Client

x: ISN of the Server

详解TCP/IP协议的连接建立与释放

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。

(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

图1 TCP三次握手建立连接

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

TCP采用四次挥手关闭连接如图2所示。

图2  TCP四次挥手关闭连接

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

本文摘自:

《TCP连接的状态转换图深度剖析》

http://www.diybl.com/course/6_system/linux/Linuxjs/2007104/76065.html

TCP三次握手及四次挥手详细图解

参考:

《TCP/IP详解-卷1》第18章《TCP连接的建立与终止》

http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010年12月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
TCP之三次握手四次挥手
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
程序猿DD
2018/07/31
5050
TCP之三次握手四次挥手
TCP三次握手&四次挥手
TCP提供一个面向连接的,可靠的字节流服务 面向连接意味着两个使用TCP的应用(通常是一个客户端和服务器)在彼此交换数据之前必须先建立 一个TCP连接。 在一个TCP连接中,仅有两方进行彼此通信
切图仔
2022/09/14
5160
TCP三次握手&四次挥手
TCP三次握手四次挥手(三国版)
TCP的三次握手和四次挥手不管是我们自己使用还是面试都是需要掌握的,本文先将原理,然后以三国为例讲个小栗子帮助理解。先来一张图:
玖柒的小窝
2021/11/28
3890
TCP三次握手四次挥手(三国版)
TCP协议—三次握手四次挥手的原理<转> 三次握手四次挥手的原理
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信息。
飞天小子
2018/08/31
4990
TCP协议—三次握手四次挥手的原理<转>
		三次握手四次挥手的原理
网络通信——TCP “三次握手“、“四次挥手“ 详解
第一次握手: 客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
SmallRoll小卷
2023/03/03
5160
网络通信——TCP “三次握手“、“四次挥手“ 详解
TCP的三次握手和四次挥手
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP工作在网络OSI七层模型中的第四层-传输层,下面一张图展示
JavaQ
2018/04/04
6810
TCP的三次握手和四次挥手
三次握手和四次挥手简单理解
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
不会飞的小鸟
2020/07/29
2.5K0
三次握手和四次挥手详细介绍
相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.
用户7657330
2020/08/14
2K0
三次握手和四次挥手详细介绍
拜托,不要再问我三次握手和四次挥手了!
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。
Bug开发工程师
2019/10/11
1K0
拜托,不要再问我三次握手和四次挥手了!
TCP 三次握手
TCP 协议在传世数据的时候,客户端(Client)和服务端(Server)会建立连接,然后把需要传输的文件进行分段,以及提供可靠的传输和流量控制!在数据传输完成后,当前的会话也要断开连接,避免资源浪费。所有 TCP 的三次握手就是建立连接的过程,而四次挥手是断开连接的过程!
软件UP
2021/05/25
8070
TCP三次握手和四次挥手过程
<p align="left">首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
用户8705057
2021/06/08
5200
三次握手和四次挥手
OSI参考模型中的网络层,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。(TCP在运输层,IP在网络层)
Krry
2018/09/10
4980
三次握手和四次挥手
TCP 三次握手 和 四次挥手
概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手。 三次握手 下图为三次握手的流程图 下面通过我
java404
2018/06/04
9790
TCP的三次握手与四次挥手
TCP提供面向有连接的通信传输,面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。
xxpcb
2020/08/04
5100
TCP的三次握手与四次挥手
TCP三次握手与四次挥手详解
占4个字节。序号使用mod运算。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号”。
知忆
2021/06/06
3880
TCP三次握手和四次挥手通俗理解
    确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
zls365
2020/08/19
6920
TCP三次握手和四次挥手通俗理解
tcp三次握手题目(tcp三次握手面试题)
(1)保证报文按序到达。 (2)保证可靠性。 (3)保证效率。 (4)精准的报告哪些报文已经收到,哪些需要重传。
全栈程序员站长
2022/07/30
5780
tcp三次握手题目(tcp三次握手面试题)
网络编程之你应该这么理解TCP的三次握手和四次挥手
网络传输层负责最底层的底层链路连接。两台主机之间进行互联,基于网线的物理硬件上的协议。在这个侧面,主机与主机之间只认得硬件mac编码。并不认识IP。
lyb-geek
2018/07/26
4770
网络编程之你应该这么理解TCP的三次握手和四次挥手
面试常问!!TCP的三次握手与四次挥手理解
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
乔戈里
2019/04/24
5650
面试常问!!TCP的三次握手与四次挥手理解
TCP三次握手和四次挥手
(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
云计算小黑
2022/12/28
5020
TCP三次握手和四次挥手
相关推荐
TCP之三次握手四次挥手
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档