Linux TCP/IP协议之三次握手

TCP/IP协议是整个网络通信中最重要的协议,它提供可靠安全的通信服务,这里只讲数据传输层的TCP协议的三次握手及相关内容。

一,TCP报文头部报文数据结构

1,字段详细说明:
源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。
序号(seq):占4个字节。序号使用mod运算。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。
确认序号(用小写的ack表示):占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到。
数据偏移:占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。
保留:占6位,保留为今后使用,目前置为0。
6位标志位:URG、ACK、PSH、RST、SYN、FIN:

URG: 标识紧急指针是否有效 ;
ACK: 标识确认序号是否有效:1表示有效,0表示无效;
PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走 ;
RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段 ;
SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段 ;
FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段;

窗口:占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据。
检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP数据报一样,在计算检验和时,也要在TCP报文段的前面加上12字节的伪首部。伪首部的格式与UDP用户数据报的伪首部一样,但要将伪首部第四个字段中的17 改为6(协议号),把第5字段中的UDP长度改为TCP长度。
紧急指针:占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。

二,三次握手过程

1,过程文字说明:

第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确 认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,至此双方完成三次握手,随后Client和Server就可以开始传输数据。

2,状态说明:

2.1, 三次握手的状态:
LISTEN:侦听来自远方的TCP端口的连接请求;
SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了);
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了);
ESTABLISHED:代表一个打开的连接;

2.2, 四次挥手的状态(顺道提一下,为TCP断开时的状态)
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2:从远程TCP等待连接中断请求;
CLOSE-WAIT:等待从本地用户发来的连接中断请求;
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击);
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED:没有任何连接状态。

三,SYN攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect),此时服务器处于Syn_RECV状态,当收到ACK后,服务器转入ESTABLISHED状态。
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击,DDOS攻击就是在多台客户端发起的分布式DOS攻击。当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。

在Linux下可以如下命令检测是否被Syn攻击:

命令1:
   netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘
命令2:
   netstat -n|grep ^tcp|awk ‘{print $NF}‘|sort -nr|uniq -c
命令3:
   netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}‘
返回结果一般如下:
   LAST_ACK 5 (正在等待处理的请求数)
   SYN_RECV 30
   ESTABLISHED 1597 (正常数据传输状态)
   FIN_WAIT1 51
   FIN_WAIT2 504
   TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)

四,TCP三次握手包的抓取
linux提供了非常强大的tcpdump命令用于抓取:
4.1,tcpdump参数:
-A 以ASCII格式打印出所有分组,并将链路层的头最小化。
-c 在收到指定的数量的分组后,tcpdump就会停止。
-C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
-d 将匹配信息包的代码以人们能够理解的汇编格式给出。
-dd 将匹配信息包的代码以C语言程序段的格式给出。
-ddd 将匹配信息包的代码以十进制的形式给出。
-D 打印出系统中所有可以用tcpdump截包的网络接口。
-e 在输出行打印出数据链路层的头部信息。
-E 用[email protected] algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
-f 将外部的Internet地址以数字的形式打印出来。
-F 从指定的文件中读取表达式,忽略命令行中给出的表达式。
-i 指定监听的网络接口。
-l 使标准输出变为缓冲行形式,可以把数据导出到文件。
-L 列出网络接口的已知数据链路。
-m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
-M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
-b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
-n 不把网络地址转换成名字。
-nn 不进行端口名称的转换。
-N 不输出主机名中的域名部分。
-t 在输出的每一行不打印时间戳。
-O 不运行分组分组匹配(packet-matching)代码优化程序。
-P 不将网络接口设置成混杂模式。
-q 快速输出。只输出较少的协议信息。
-r 从指定的文件中读取包(这些包一般通过-w选项产生)。
-S 将tcp的序列号以绝对值形式输出,而不是相对值。
-s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
-t 不在每一行中输出时间戳。
-tt 在每一行中输出非格式化的时间戳。
-ttt 输出本行和前面一行之间的时间差。
-tttt 在每一行中输出由date处理的默认格式的时间戳。
-u 输出未解码的NFS句柄。
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
-vv 输出详细的报文信息。
-w 直接将分组写入文件中,而不是不分析并打印出来。
4.2,示例:
tcpdump -i eth1 tcp and host 147.34.34.35 and port 22 -c 20000 -s 0 -nn
tcpdump具体使用规则可百度。

站在巨人的肩膀上,你会看的更远!

原文地址:https://www.cnblogs.com/entrepreneur/p/11490674.html

时间: 2024-10-11 18:26:09

Linux TCP/IP协议之三次握手的相关文章

TCP/IP协议之三次握手、四次断开详解

TCP三次握手详细介绍 1.TCP/IP协议简单介绍: TCP/IP是一个协议族,通常分不同层次进行工作,每个层次负责不同的通信功能.包含以下四个层次: 应用层:(http.telnet.Email.dns等协议) 传输层:(tcp和udp) 网络层:(ip.icmp.rarp.bootp) 链路层:(设备驱动程序及接口卡) 1).链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. 2).网

TCP/IP协议之三次握手与四次挥手

大纲 一.IP Header 二.TCP Header 三.三次握手过程 四.四次挥手过程 五.TCP Finite State Machine 一.IP Header 二.TCP Header 三.三次握手过程 三次握手过程详解: ①第一次握手:客户端向服务器端发送连接请求包,标志位SYN(同步序号)置为1,产生序列号为X=0 ②第二次握手:服务器端收到客户端发过来报文,由SYN=1知道客户端要求建立联机.于是向客户端发送一个SYN和ACK都置为1的TCP报文,设置自己的初始序列号Y=0,将确

TCP/IP协议三次握手和四次挥手大白话解说

TCP/IP协议三次握手和四次挥手大白话解说 前言 昨天晚上被一位师傅问到了TCP/IP的工作机制,心里很清楚三次握手,然而对于四次挥手却忘了,这是大学习里学过的,奋而翻阅书籍和网络对之前所学的做一个温顾,算是夯实自我吧. TCP(Transmission Control Protocol)网络传输控制协议,是一种面向连接的.可靠的.基于字节流的传输层通信协议,数据传输前建立连接的工作要经过三次握手,数据传输后断开连接的工作要经过四次挥手. 工作过程 TCP标志位: TCP共有6个标志位,分别是

TCP/IP协议三次握手与四次握手流程解析

原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图 上图中有几个字段需要重点介绍下:   (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记.   (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1.   (3)标志位:共6个,即URG.ACK.PSH.RST

TCP/IP协议 三次握手与四次挥手

一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下:        (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记.        (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1.        (3)标志位:共6个,即URG.ACK.PSH.RST.SYN.FIN等,具体含

TCP/IP协议三次握手流程

一.TCP/IP 协议三次所握手: 所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示: 图2 TCP三次握手 (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认.  (2)第二次握手:Server收

TCP/IP协议三次握手与四次握手流程解析(转)

一.TCP报文格式 下面是TCP报文格式图: 上图中有几个字段需要重点介绍下:  (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记.  (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1.  (3)标志位:共6个,即URG.ACK.PSH.RST.SYN.FIN等,具体含义如下:  (A)URG:紧急指针(urgent pointer)有效.  (B)ACK:确认序号有效.  (C)PSH:

TCP/IP协议三次握手与四次挥手

一.标志位和序号 seq序号 :发送方随机生成的 ack确认序号:ack=seq+1 标志位ACK=1时确认序号有效 SYN标志位:发起一个新连接 ACK标志位:确认序号有效 FIN标志位:断开连接 二.三次握手 三次握手是客户端与服务端建立一个TCP连接时,需要客户端和服务端发送三个包建立连接的过程 (1)第一次握手 客户端将SYN置为1,随机产生一个seq序号=J,将该数据包发送给服务端,客户端此时状态为SYN_SEND (2)第二次握手 服务端收到客户端发送的数据包由SYN=1知道客户端要

通俗理解TCP/IP协议三次握手四次分手流程

转自:https://blog.csdn.net/special23/article/details/54137298 三次握手流程 客户端发个请求“开门呐,我要进来”给服务器 服务器发个“进来吧,我去给你开门”给客户端 客户端有很客气的发个“谢谢,我要进来了”给服务器 四次挥手流程 客户端发个“时间不早了,我要走了”给服务器,等服务器起身送他 服务器听到了,发个“我知道了,那我送你出门吧”给客户端,等客户端走 服务器把门关上后,发个“我关门了”给客户端,然后等客户端走(尼玛~矫情啊) 客户端发