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是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...
随机推荐
- CF1119C Ramesses and Corner Inversion
题目地址:CF1119C Ramesses and Corner Inversion 将两个矩阵异或起来,为 \(1\) 的位置就是需要修改的位置 注意到每一次操作都会导致两行和两列上有两个数被修改 ...
- POJ1321 棋盘问题(简单搜索)
题意: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放 ...
- Niagara workbench (Basic )
1.the basic information about workbench Last saved station open in the workbench or opened another ...
- centos6.5环境下的web项目mysql编码方式导致的中文乱码问题
最近在centos6.5下部署web项目时网页出现中文乱码的问题,在排除掉php之后,把问题锁定在mysql的编码方式上. 解决方法如下: 首先进入mysql命令行,输入命令:SHOW VARIABL ...
- jquery 第三章
1.回顾$(document).ready(function(){ })$(function(){ }) ID选择器.类选择器.元素选择器层次选择器:空格(上文下:tr td{})属性过滤 ...
- Invalid tld file: "/WEB-INF/tags/xxxt.tld", see JSP 2.2 specification section 7.3.1 for more details
错误描述 在jsp页面引入了自定义的TLD文件的时候,碰到了一个错误 Invalid tld file: "/WEB-INF/tags/xxxt.tld", see JSP 2.2 ...
- [转] vue之computed和watch
计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...
- Java _类 相关知识
成员变量 java对象的属性就是成员变量,其实成员变量就是指普通的变量,可以设置初始值,也可以不设置.当不设置时,会被设置为默认值.(当成员变量前面有private关键词时,说明定义了一个私有成员) ...
- 初学Python的一些细节
一.python的数据类型 1.python的基本数据类型包括数值数据类型和字符串数据类型:基本数据类型的特点是不允许改变,如果改变基本数据类型的值,会导致内存的重新分配. int 整形 二进制 ...
- 【redis】-- springboot集成redis及使用
springboot自动配置的redis并不是特别好用,所以需要我们使用原生的jedis, 1.添加依赖 2.在application文件中配置 # Redis服务器地址 redis.host= # ...