TCP三次握手那些事
临近5月,春招和实习招聘逐渐进入尾声。本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识。
参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次挥手)。
一般来说,TCP连接的过程是客户端发起,服务端确认请求,客户端再确认的三次握手过程。
具体三次如下:
1、客户端向服务器端发送SYN=1的TCP包,并附带初始序列号x。发送后,客户端的状态是SYN_SEND状态。
2、服务器端向客户端发送SYN=1,ACK=1的确认包,其序列号是服务器自己的序列号y,而确认序列号为x+1 。服务器端的状态是SYN_RCVD状态。
3、客户端再发送ACK=1的确认包,其序列号为x+1,确认序列号为y+1 。至此进入ESTABLISHED状态,TCP连接建立。
答到这里,面试官可能会问第二个问题:
能不能两次握手?
答案是不行。对于这个问题,RFC-793的原文是:
The principle reason for the three-way handshake is to prevent old
duplicate connection initiations from causing confusion. To deal with
this, a special control message, reset, has been devised. If the
receiving TCP is in a non-synchronized state (i.e., SYN-SENT,
SYN-RECEIVED), it returns to LISTEN on receiving an acceptable reset.
If the TCP is in one of the synchronized states (ESTABLISHED,
FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT), it
aborts the connection and informs its user.
我想大家都能理解。
很多时候,许多面经就到此为止了。但也经常会有一些扩展性问题,下面给出一些问题的解答:
1、TCP连接时,客户端不进行第三次握手会如何?
若不进行第三次握手,服务端将处在SYN_RCVD状态。若有很多(伪造的)客户端发起连接而不进行第三次握手,服务端不得不一一确认,并分配内存处理。
不仅如此,服务端要维护一个未连接队列,放置那些未完成的连接(半连接)。而大量伪造的连接将使半连接数达到最大值,使得正常连接被丢弃,最终导致网络瘫痪等问题。
这就是SYN洪泛,是一种拒绝服务攻击。
其实要识别这种攻击很简单,只要查看服务器上是否有大量的半连接即可。但这种攻击无法完全被阻止。
一种可行的方法是SYN Cookie,记录SYN连接的发起者,只有真正建立了连接,服务器才会为它分配内存。
还有其他方法例如过滤网关和增加最大半连接数。
2、TCP三次握手能否携带数据?
第三次握手是可以携带数据的。
3、TCP三次握手的开销过大?
T/TCP通过使用加速打开来避免三次握手:
1) 它为打开的连接指定一个32 bit的连接计数CC (Connection Count),无论主动打开还是
被动打开。一个主机的CC值从一个全局计数器中获得,该计数器每次被使用时加1。
2) 在两个使用T/TCP的主机之间的每一个报文段都包括一个新的TCP选项CC。这个选项
的长度为6个字节,包含发送方在该连接上的32bit的CC值。
3) 一个主机维持一个缓存,该缓存保留每个主机上一次的CC值,这些值从来自这个主机
的一个可接受的SYN报文段中获得。
4) 当在一个开始的SYN中收到一个CC选项的时候,接收方比较收到的值与为该发送方缓
存的CC值。如果接收到的CC比缓存的大,则该SYN是新的,报文段中的任何数据被
传递给接收应用进程(服务器)。这个连接被称为半同步。
如果接收的CC比缓存的小,或者接收主机上没有对应这个客户的缓存CC,则执行正常
的TCP三次握手过程。
5) 为响应一个开始的SYN,带有SYN和ACK的报文段在另一个被称为CCECHO的选项中
回显所接收到的CC值。
6) 在一个非SYN报文段中的CC值检测和拒绝来自同一个连接的前一个替身的任何重复的
报文段。
这种“加速打开”避免了使用三次握手的要求,除非客户或者服务器已经崩溃并重新启
动。这样做的代价是服务器必须记住从每个客户接收的最近的CC值。
4、TCP的初始序列号能否固定?
不建议,一是路由器会缓存数据包,导致序列号并非预期所设置;
二是如果序列号和四元组能够对应的话,那这个包就会被接受方确认。固定初始序列号容易被猜出,从而受到恶性攻击。
注:
本文主要引自《TCP/IP详解 卷一:协议》,部分内容源于网上。
如有侵权,请告知。
TCP三次握手那些事的更多相关文章
- TCP三次握手与四次挥手详解
目录 TCP三次握手与四次挥手详解 1.TCP报文格式 2.TCP三次握手 3.TCP四次挥手 4.为什么建立连接需要三次握手? 5.为什么断开连接需要四次挥手? 6.为什么TIME_WAIT状态还需 ...
- 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...
- TCP三次握手、四次挥手详解
1.TCP报文格式 TCP(Transmission Control Protocol) 传输控制协议.TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接. 我们需要 ...
- 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...
- TCP三次握手/四次挥手详解
一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...
- wireshark抓包工具简介以及tcp三次握手的一些含义
wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了.为了安全考虑, ...
- TCP三次握手四次挥手
看到一篇总结很好的TCP三次握手,学习一下,原文链接. 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,S ...
- TCP ,UDP概念和TCP三次握手连接 的知识点总结
OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...
- Wireshark基本介绍和学习TCP三次握手
wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...
随机推荐
- smartgit
1.同步最新分支 2.smartgit ctrl+2 可以看到本地新增加的文件
- 分布式系列四: HTTP及HTTPS协议
分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...
- 【转】Python3 操作符重载方法
Python3 操作符重载方法 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/70769628 以下代码 ...
- ES6 语法学习(一)
1.let 和 const 关键字 let 与 var 的区别有: a.let 声明的变量只在当前的块级作用域内有效(块级作用域通俗的话就是被{}包裹起来的区域声明对象的{}例外). b.let 声明 ...
- SVN 版本控制安装
客户端 一路点击next即可 注意事项: 这个一定要选,否则后面使用会出现问题. 选择下拉菜单的第一项
- Java获取Ip发送邮件
import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.servlet. ...
- powershell 激活WIN10
1.以win10专业版为例,鼠标右键点击开始图标,选择[windows powershell(管理员)],或者命令提示符管理员:2.打开命令窗口,复制这个命令slmgr /ipk W269N-WFGW ...
- OpenCV绘制图像中RGB三个通道的直方图
一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...
- nginx+apache动静分离/负载均衡
[主从] [Mysql-Master] log-bin=mysql-bin server-id = MariaDB [(none)]> grant replication slave on *. ...
- CSS属性兼容写法
一种是用js判断兼容性 // JS if ("CSS" in window && "supports" in window.CSS) { var ...