文档章节

TCP 三次握手和四次挥手

编走编想
 编走编想
发布于 2015/11/21 14:10
字数 1171
阅读 232
收藏 33

总结一下这个基本知识点,确保自己真的理解正确了

先来看 TCP 状态图和 TCP 包格式

TCP 状态图

▲ TCP 状态图

TCP 包结构

▲ TCP 包结构

上面转自伯乐在线(伯乐在线转自 CSDN 的一篇博文)的 TCP 包结构图其实存在错误。其中的 PST 应该为 RST,意为 Reset connection,后面介绍四次挥手的时候再介绍 RST。对于规范性的技术,最好是参考维基百科或 RFC 之类的文档。尽信书不如无书,我开始也没能发现

三次握手

TCP 三次握手

所谓 TCP 服务器端,是指其 TCP 协议栈会监听某个端口上的连接事件。

  1. 服务器开始处于监听状态。当客户端要连接服务器端时,客户端首先会发送一个 TCP 消息,其 SYN=1,并生成一个随机的 seq number,我们记为 seq=x。在用 Wireshark 分析 TCPDUMP 时,其显示的 seq 为 0,因为 Wireshark 为了用户方便,显示的是 seq 的相对值。在发送 SYN 之后,客户端的 TCP 栈便处于 SYN SENT 状态。
  2. 当服务器端收到客户端发来的 SYN 消息(SYN 位为 1 的 TCP 消息)之后,便回复了一个 TCP 消息,其 SYN=1,ACK=1,seq=y,ack=x+1。ACK 表示确认,ack 的值为其所确认的 SYN 包中 seq 值加 1。seq 值为一个随机值。因为 TCP 是一个双工的协议,两个方向都可以传输数据,所以需要在两个方向都确认可以传输数据,因此需要双方都发 SYN。这是服务器端的 TCP 协议栈对于当前连接来说处于 SYN RCVD 状态。
  3. 当客户端收到服务器端的 SYN,ACK 时,客户端便会返回一个 ACK 以确认这个 SYN 包,ack 便为 y+1。
  4. 当连接建立之后,对于 TCP 而言,就无所谓客户端服务器端

四次挥手

当 TCP 连接要被断开的时候,便会有所谓的四次挥手的过程。

四次挥手

  1. 用于断连接 TCP Flag 是 FIN。断连接时,一发起方放出一个 FIN 包,seq 值为一个随机值,这里记为 u。
  2. 对端在收到 FIN 之后会用 ACK 响应这个 FIN。所以 ack=u+1
  3. 接下来另一方也会发出 FIN 包。这还是因为 TCP 是双工的,所以双向都要关闭连接。在上图中,另一方发的 TCP 消息是 FIN + ACK。如果是演示四次挥手的过程,FIN 和 ACK 是分开的。在真实 TCP 协议栈的实现中,多数情况 FIN 和 ACK 是同时发出,即上图所演示的那样。如果另一端同时发送 FIN 和 ACK,那上图的第二个消息,即 ACK 消息其实是不存在的。所以,很多情况 TCP 断连接的过程是“三次挥手”。
  4. 同样,在客户端收到服务器端的 FIN+ACK 包之后,其也会回复一个 ACK 已确认之前的 FIN 包。

在断连接时,有时也能看到 RST 包。这种情况常见于在断连接开始之后,被动的一方还有数据没有发送完毕。这时这一方便会使用 RST 在断连接的同时发送剩余的数据。这些都是 TCP 协议栈(或者说是系统 Kerel)去根据不同情况作出的选择。

附:CLOSED_WAIT 和 TIME_WAIT

常见的和关闭连接相关的 TCP 状态有 TIME_WAIT 和 CLOSED_WAIT。如果常有大量的 TCP 短连接到 TCP 服务器上,那么就会看到很多的连接处于 TIME_WAIT 和 CLOSED_WAIT。

过多的 CLOSED_WAIT 或 TIME_WAIT 连接都是一件危险的事情。

过多的 CLOSED_WAIT

通常情况下 CLOSED_WAIT 状态持续的时间不应该很长。如果有连接长期处于 CLOSED_WAIT 往往以为着程序错误。曾经使用 Apache HttpComponents HttpClient,发现服务器端关闭 TCP 连接之后其不会自动关闭连接,必须手动执行连接关闭操作。如果不注意变化造成很多 CLOSED_WAIT 状态的连接(严格来说不应该说连接出于什么状态,而是 TCP 协议栈处于什么状态。用 netstat 查看的其实是本方协议栈的状态)。

过多的 TIME_WAIT

如上图所示,TIME_WAIT 状态在一段时间之后就会变为关闭状态。但是过多的 TIME_WAIT 也会消耗资源。一些系统设置可以降低大量 TIME_WAIT 对系统的影响。比如可以配置系统在连接数不够的时候重用 TIME_WAIT 连接。

vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

© 著作权归作者所有

编走编想
粉丝 152
博文 129
码字总数 112781
作品 0
海淀
程序员
私信 提问
TCP三次握手和四次挥手

哈喽!大家好,今天我们来共同认识一下什么是三次握手和四次挥手,来了解一下TCP客户端和服务器之间是如何进行通信的,又如何释放连接的呢? 其实,实际上三次握手就是指建立一个TCP连接时,...

MRUJ
2017/09/01
0
0
TCP三次握手和四次挥手全过程及为什么要三次握手解答

TCP三次握手和四次挥手的全过程 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ACK(acknowl...

Tenderrain
2017/11/10
0
0
TCP三次握手与四次挥手

TCP三次握手 一、什么是三次握手 三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。 二、三次握手的目的 三次握手的目的是连接服务器指定端口,建立...

Lightmisa
2017/09/29
0
0
简明理解三次握手和四次挥手

注:三次握手和四次挥手本身并不复杂,但却可以从很多角度理解这两个过程,本文仅取一个视点解读,如有其它看法欢迎留言交流。 三次握手与四次挥手分别对应TCP连接建立过程与断开过程,先上T...

hello-k
2018/02/28
52
0
TCP/IP协议 三次握手与四次挥手

一、TCP报文格式 TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从T...

小和尚敲代码
2016/02/22
97
0

没有更多内容

加载失败,请刷新页面

加载更多

新建作业20191011121223

2.编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound,Sally shouted,"By the Great Pumpkin,what was that!" #include<stdio.h>int main(){printf("\a");......

电子197朱妍
21分钟前
3
0
家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
42分钟前
6
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
43分钟前
5
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
45分钟前
9
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
49分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部