tcpdump抓包分析TCP三次握手过程
简述tcp使用三次握手建立连接的过程。
简述tcp使用三次握手建立连接的过程。
TCP使用三次握手建立连接是为了确保通信双方能够建立可靠的连接,保证数据能够准确可靠地传输。
第一次握手:客户端向服务器发送一个SYN包,其中包含客户端的初始序列号(ISN)。
客户端进入SYN_SENT状态,等待服务器的确认。
第二次握手:服务器收到客户端的SYN包后,发送一个SYN-ACK包作为回应。
这个包中包含服务器的初始序列号(ISN),同时也确认了客户端的SYN包。
服务器进入SYN-RCVD状态。
第三次握手:客户端收到服务器的SYN-ACK包后,发送一个ACK包作为回应。
这个ACK包会确认服务器的SYN-ACK包,并包含客户端确认序列号(ACK)。
服务器收到这个ACK包后,进入ESTABLISHED状态,而客户端也进入ESTABLISHED状态,此时连接已经建立。
通过三次握手,客户端和服务器能够建立起双向的通信连接。
这种方式的设计可以保证连接的可靠性和可用性,因为每个阶段都需要一方确认对方的状态。
如果在握手过程中某一次握手失败,连接将无法建立成功,通信双方可以根据超时时间来进行后续的重试。
三次握手过程中的每个步骤都有特定的目的:1. 第一次握手:客户端发送SYN包给服务器,请求建立连接,并初始化客户端的序列号。
2. 第二次握手:服务器收到SYN包后,发送SYN-ACK包给客户端,确认客户端的SYN请求,并初始化服务器的序列号。
3. 第三次握手:客户端收到SYN-ACK包后,发送ACK包给服务器,确认服务器的SYN-ACK,并初始化客户端的确认序列号。
通过三次握手,双方能够互相确认对方的状态,并初始化自己的序列号和确认序列号。
这样,在数据传输过程中双方就能够按照正确的顺序接收和发送数据,确保数据的可靠性和完整性。
需要注意的是,三次握手只是建立连接的过程,关闭连接时需要进行四次挥手。
挥手的过程是为了确保数据在关闭连接时能够完全传输完毕,而不会丢失或被中途截断。
tcp握手的过程及抓包分析原理详细版
TCP 握手的过程及抓包分析原理TCP 连接建立在TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。
服务器必须准备好接受外来的连接。
这通过调用socket 、 bind 和listen 函数来完成,称为被动打开(passive open)。
第一次握手:客户端通过调用connect 进行主动打开(active open)。
这引起客户TCP 发送一个SYN (表示同步)分节(SYN=J ),它告诉服务器客户将在连接中发送到数据的初始序列号。
并进入SYN_SEND 状态,等待服务器的确认。
第二次握手:服务器必须确认客户的SYN ,同时自己也得发送一个SYN 分节,它含有服务器将在同一连接中发送的数据的初始序列号。
服务器以单个字节向客户发送SYN 和对客户SYN 的ACK (表示确认),此时服务器进入SYN_RECV 状态。
第三次握手:客户收到服务器的SYN+ACK 。
向服务器发送确认分节,此分节发送完毕,客户服务器进入ESTABLISHED 状态,完成三次握手。
图1:TCP 握手建立连接客户端的初始序列号为J ,而服务器的初始序列号为K 。
在ACK 里的确认号为发送这个ACK 的一端所期待的下一个序列号。
因为SYN 只占一个字节的序列号空间,所以每一个SYN 的ACK 中的确认号都是相应的初始序列号加1.类似地,每一个FIN (表示结束)的ACK 中的确认号为FIN 的序列号加1.客户connet (阻塞connet 返回socket,bind,listen (被动打开) accept (阻塞) accdept 返回read (阻塞)。
TCP三次握手四次挥手过程及原理
TCP三次握手四次挥手过程及原理TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输控制协议。
在一个TCP连接的建立和断开过程中,都需要进行三次握手和四次挥手。
1. TCP三次握手(Three-Way Handshake)过程三次握手的目的是在发送和接收数据之前,确保双方都能正常地建立起连接。
握手过程如下:第一步:客户端发送请求连接的SYN(Synchronize)报文段,其中的SYN标志位被置为1,随机选择一个序号seq=x,并将该报文段发送给服务端。
第二步:服务端接收到SYN报文段后,会发送一个SYN+ACK报文段作为确认,其中SYN和ACK标志位都被置为1,服务端还会随机选择一个序号seq=y和一个确认号ack=x+1,并将该报文段发送给客户端。
第三步:客户端接收到SYN+ACK报文段后,会再次发送一个ACK报文段作为最终确认,其中ACK标志位被置为1,确认号ack=y+1,序号seq=x+1,并将该报文段发送给服务端。
当服务端接收到该最终ACK报文段后,整个三次握手过程完成,TCP 连接建立成功,双方可以开始进行数据的传输。
三次握手的原理是通过双方的一系列报文段交互,确保双方都具备接收和发送数据的能力。
这样可以防止服务端收到重复连接请求和客户端无法接收服务端的响应。
2. TCP四次挥手(Four-Way Handshake)过程四次挥手的目的是在断开连接时,客户端和服务端都能正常地结束连接。
挥手过程如下:第一步:客户端发送一个FIN(Finish)报文段,其中的FIN标志位被置为1,并且带有一个序号seq=u,发送给服务端。
第二步:服务端接收到客户端的FIN报文段后,会发送一个ACK报文段作为确认,ACK标志位被置为1,确认号ack=u+1,并将该报文段发送给客户端。
第三步:在服务端接收到客户端的FIN报文段后,服务端还需要等待一段时间,将所有的数据都发送给客户端。
TCP报文测试三次握手
TCP UDP报文测试1.目的:通过wireshark 嗅探(抓包)来熟练掌握TCP UDP,的报文头部,并且通过实验分析出TCP的三次握手建立连接,四次握手断开连接,比较TCP UDP的相同点和不同点。
2.测试环境:本机wireshark抓包软件3.测试步骤:本机联网,通过访问百度QQ 分别抓取TCP UDP 报文,且截取报文头部进行分析,截图如下:Source port:源端口标识报文的返回地址Destination port:目的端口这个端口指明接收方的应用程序接口Sequence number:序列号标示报文段中的第几个数据字节(32的数)Header length:头部长度Window size vlan:窗口流控指明每次只能接收多少字节Checksum:校验和错误检查Options:选项标识哪个选项(如果有的话)有效TCP:截图进行3次握手分析:截图如下(访问网页)通过访问百度抓取的连续3个包进行分析(203)(204)(205)整个过程:本机访问百度发起SYN 对方收到确认并且返回SYN 最后本机收到发起ACK确认建立连接四次握手断开连接过程:同样访问百度截图如下:用143 144 145包进行分析:整个过程:三次握手最后ACK确认,下一个包出现FIN=1,表示发送端已经发送到数据末尾,数据传送完成发送FIN标志位的TCP段,连接将被断开。
UDP:访问腾讯QQ 进行抓取我们选中110 111包来进行分析:(110)(111)通过包头可以发现UDP包头中的字段都有在TCP中出现,各字段的含义和作用和TCP一样。
4测试结果:验证了三次握手四次握手断开得以实验,分析出了TCP UDP 报文头部的基本含义和作用5.总结:通过测试了解了TCP UDP的相同点和不同点,记录如下:相同点都是传输层的协议不同点可以看出的是TCP的报文头部相对于UDP来说,更加复杂,而UDP的报文头部比较简单。
TCP中有序列号和确认号的概念,这就保证了TCP的连接是可靠的,而UDP中是没有的,所以说UDP是不可靠的。
简要描述tcp协议的3次握手过程
简要描述tcp协议的3次握手过程
TCP协议的3次握手过程
TCP(Transmission Control Protocol)是一种面向连接的可靠传输
协议,它保证数据的可靠传输。
在使用TCP协议进行通信时,需要进
行3次握手过程以建立连接,详细描述如下:
第一次握手:客户端发送SYN报文
客户端向服务器发送一个SYN(Synchronize Sequence Number)
报文,其中SYN标志位被设置为1。
该报文中包含一个随机的序列号seq=x。
第二次握手:服务器回复ACK+SYN报文
服务器接收到客户端发送的SYN报文后,需要回复一个ACK (Acknowledgement)和SYN标志位都被设置为1的报文。
在该报文中,确认号ack=x+1,并且服务器也会生成一个随机序列号seq=y。
第三次握手:客户端回复ACK报文
最后一步是客户端回复一个ACK确认包给服务器。
该包中ack=y+1,并且seq=x+1。
建立连接后,双方就可以开始进行数据传输了。
注意事项:
1. 三次握手过程是为了确保双方都能够正确地收发数据。
如果只有两
次握手,则可能存在重复或者丢失数据的情况。
2. 在三次握手过程中,每个阶段都需要等待对方确认才能进入下一阶段。
如果某个阶段超时,则需要重新发送对应的报文。
3. 在三次握手过程中,每个报文中都包含了序列号和确认号。
这些信
息用于确保数据的可靠传输。
4. TCP协议是一种面向连接的协议,因此在通信结束后,需要进行四
次挥手过程以关闭连接。
简述三次握手和四次挥手的流程
一、三次握手的流程1. 客户端向服务器发起连接请求在进行三次握手的第一步,客户端会向服务器发送一个特殊的SYN(同步)包,来请求建立连接。
这个包中会包含一个随机生成的序列号,作为本次连接的起始值。
2. 服务器确认客户端的请求收到客户端的SYN包之后,服务器会向客户端发送一个ACK (确认)包作为应答,并且也会包含一个随机生成的序列号,作为本次连接的起始值。
此时,服务器也会发送一个SYN包给客户端,表示自己也同意连接。
3. 客户端确认服务器的应答客户端收到服务器的ACK包之后,同样会发送一个ACK包作为应答,表示客户端也同意建立连接。
此时,双方的连接就正式建立起来了。
二、四次挥手的流程1. 客户端告知服务器自己要断开连接在进行四次挥手的第一步,客户端会向服务器发送一个FIN(结束)包,表示自己要断开连接。
2. 服务器收到客户端的请求,确认可以断开连接服务器收到客户端的FIN包之后,会向客户端发送一个ACK包作为应答,表示自己已经收到了客户端的断开连接请求,并且同意断开连接。
3. 服务器也告知客户端自己要断开连接在进行四次挥手的第三步,服务器会向客户端发送一个FIN包,表示自己也要断开连接。
4. 客户端确认服务器的应答,断开连接客户端收到服务器的FIN包之后,会向服务器发送一个ACK包作为应答,表示自己已经收到了服务器的断开连接请求,并且同意断开连接。
此时,连接就正式断开了。
总结:三次握手和四次挥手是TCP协议中用于建立和断开连接的过程,通过以上流程的描述,我们可以清晰地了解到建立连接和断开连接的详细步骤。
这对于网络通信的稳定性和安全性有着重要的意义。
在网络通信中,TCP协议的三次握手和四次挥手是非常重要的过程,它们保证了数据的可靠传输和连接的安全关闭。
接下来,我们将对三次握手和四次挥手的过程进行更深入的探讨。
我们来看三次握手的过程。
在这个过程中,客户端和服务器需要经历一系列步骤来建立可靠的连接。
客户端向服务器发送一个特殊的SYN (同步)包,其中包含一个随机生成的序列号,用于标识本次连接的起始值。
描述tcp三次握手和4次挥手的过程
TCP三次握手和四次挥手是计算机网络中非常重要的概念,它们是建立和断开TCP连接时所遵循的标准流程。
本文将对TCP三次握手和四次挥手的过程进行详细描述,帮助读者深入了解这两个过程的原理和流程。
一、TCP三次握手的过程TCP三次握手是在客户端和服务器之间建立连接时所执行的步骤,具体过程如下:1. 客户端发送SYN包给服务器:当客户端希望发起一个TCP连接时,它会向服务器发送一个SYN(同步)包,其中包含了客户端的初始序列号。
2. 服务器收到SYN包并回复ACK+SYN包:服务器在接收到客户端的SYN包后,会回复一个ACK(确认)和SYN包,其中ACK用于确认收到客户端的SYN包,而SYN用于告知客户端服务器的初始序列号。
3. 客户端收到ACK+SYN包并回复ACK包:客户端在接收到服务器的ACK+SYN包后,会回复一个ACK包,用于确认服务器收到了客户端的SYN包。
这样,TCP连接就建立起来了,客户端和服务器可以开始进行数据传输了。
以上就是TCP三次握手的完整过程,通过这个过程,客户端和服务器成功建立了TCP连接,可以进行数据交换。
二、TCP四次挥手的过程TCP四次挥手是在客户端和服务器断开连接时所执行的步骤,具体过程如下:1. 客户端发送FIN包给服务器:当客户端希望断开与服务器的TCP连接时,它会向服务器发送一个FIN(结束)包,表示客户端不再发送数据了。
2. 服务器收到FIN包并回复ACK包:服务器在接收到客户端的FIN 包后,会回复一个ACK包,用于确认收到客户端的FIN包。
此时,服务器仍然可以向客户端发送数据。
3. 服务器发送FIN包给客户端:当服务器不再需要连接时,它会向客户端发送一个FIN包,表示服务器不再发送数据了。
4. 客户端收到FIN包并回复ACK包:客户端在接收到服务器的FIN 包后,会回复一个ACK包,用于确认收到服务器的FIN包。
此时,TCP连接就完全释放了,客户端和服务器之间的连接彻底断开。
5.使用Wireshark观察TCP三次握手
实验 - 使用 Wireshark 观察 TCP 三次握手Mininet 拓扑目标第 1 部分:准备主机以捕获流量第 2 部分:使用 Wireshark 分析数据包第 3 部分:使用 tcpdump 查看数据包背景/场景在本实验中,您将使用 Wireshark 来捕获并检查数据包,数据包是在使用超文本传输协议 (HTTP) 的 PC 浏览器和 Web 服务器(例如 )之间生成的。
当一个应用程序,例如 HTTP 或文件传输协议 (FTP),在主机上首次启动时,TCP 将使用三次握手来建立两个主机之间的可靠 TCP 会话。
例如,当 PC 使用 Web 浏览器浏览互联网时,将会发起三次握手,而且 PC 主机和 Web 服务器之间将建立会话。
一个 PC 可以同时与多个网站进行多个活动的 TCP 会话。
所需资源∙CyberOps Workstation 虚拟机∙互联网接入第 1 部分:准备主机以捕获流量a. 启动 CyberOps 虚拟机。
使用用户名analyst和密码cyberops登录。
b. 启动 Mininet。
[analyst@secOps ~]$ sudo lab.support.files/scripts/cyberops_topo.pyc. 在 Mininet 中启动主机 H1 和 H4。
*** 启动 CLI:mininet>xterm H1mininet>xterm H4d. 在 H4 上启动 Web 服务器。
[root@secOps analyst]#/home/analyst/lab.support.files/scripts/reg_server_start.she. 在 H1 上启动 Web 浏览器。
这需要一些时间。
[root@secOps analyst]# firefox &f. Firefox 窗口打开后,在终端Node: H1中启动 tcpdump 会话,并将输出发送到名为capture.pcap的文件。
TCP协议三次握手过程分析
TCP协议三次握手过程分析三次握手过程实际上是客户端和服务器之间建立TCP连接的过程。
下面以客户端与服务器之间的连接为例进行分析。
1. 第一次握手(SYN):客户端向服务器发送连接请求报文段,并将序列号设为随机数(seq=x)。
该报文段中还包含一个标志位SYN (Synchronize Sequence Numbers),它告诉服务器这是一个连接请求报文段。
2. 第二次握手(SYN + ACK):服务器接收到客户端的连接请求报文后,如果同意连接,就会发送一个应答报文段,该报文段中包含了同意连接的标志位SYN和确认序号(ack=x+1),同时也会将自己的序列号设置为另一个随机数(seq=y)。
3. 第三次握手(ACK):客户端接收到服务器的应答报文段后,会向服务器发送一个确认报文段,该报文段中的确认序号设置为服务器的序列号加1(ack=y+1),同时也会将自己的序列号设置为另一个随机数(seq=x+1)。
至此,TCP连接建立完成,客户端和服务器之间可以开始传输数据。
为了确保连接的可靠性,TCP协议在三次握手过程中引入了序列号和确认序号。
序列号用于标识数据报文段中的数据字节的顺序,而确认序号则表示希望接收的下一个数据字节的序号。
当数据传输时,每个发送方和接收方都会维护一个接收窗口,用来控制发送方的发送速度,同时也可以在接收到的数据报文段中确认接收到的数据字节数,从而保证数据的可靠性。
三次握手的过程中,如果任一方没有收到对方的应答报文段,则认为连接未建立成功,会重新发起连接请求。
同时,为了防止旧的连接请求报文段在网络中滞留而导致的错误连接,服务器会检查连接请求报文段的序列号,如果该序列号小于服务器当前的序列号,则服务器会丢弃该报文段。
三次握手的过程保证了连接的可靠性和数据传输的准确性。
在建立连接的过程中,服务器和客户端都能确认对方的存在和准备好接收数据。
同时通过序列号和确认序号的使用,可以保证数据的按序传输。
TCP三次握手详解深入浅出有图有真相实例演示
TCP三次握⼿详解深⼊浅出有图有真相实例演⽰TCP是属于⽹络分层中的传输层,因为OSI分为7层,感觉太⿇烦了,所以分为四层就好了,简单。
分层以及每层的协议,TCP是属于传输层,如下两张图:TCP三次握⼿简述第⼀次握⼿客户主动(active open)去connect服务器,并且发送SYN 假设序列号为J, 服务器是被动打开(passive open)第⼆次握⼿服务器在收到SYN后,它会发送⼀个SYN以及⼀个ACK(应答)给客户, ACK的序列号是 J+1表⽰是给SYN J的应答,新发送的SYN K 序列号是K第三次握⼿客户在收到新SYN K, ACK J+1 后,也回应ACK K+1 以表⽰收到了,然后两边就可以开始数据发送数据了使⽤tcpdump观察如下:因为都是在本机同时运⾏client和server所以命令为:tcpdump -i lo port 5555, 只能监听回路lo接⼝,结果如下如图⽤红⾊圈起来的就是3次握⼿,但是为什么最后⼀次握⼿,为什么ack = 1,⽽不是369535922 呢,这是因为这⾥的第三次握⼿tcpdump显⽰的是相对的顺序号。
但是为了便于观察我们需要把tcpdump的顺序号变为绝对的顺序号。
命令只需要加-S(⼤写)便可,即:tcpdump -i lo port 5555 -S加上之后结果就正常了如下图:从tcpdump的数据,可以明显的看到三次握⼿的过程是:第⼀次握⼿:client syn 2322326583 —> server第⼆次握⼿:server syn 3573692787, ack 2322326583 + 1 —> client第三次握⼿:client ack 3573692787 + 1 –>serverTCP三次握⼿详细解析过程第⼀次握⼿1.半连接队列(syn queue)未满服务器将该连接的状态变为SYN_RCVD, 服务器把连接信息放到半连接队列(syn queue)⾥⾯。
tcp3次握手、四次挥手的流程
文章题目:深度解析TCP的3次握手和4次挥手流程TCP协议作为互联网中最重要的传输层协议之一,其3次握手和4次挥手过程是网络通信中至关重要的环节。
本文将从简到繁,由浅入深地探讨TCP协议的3次握手和4次挥手流程,以帮助读者更深入地理解这一主题,并掌握其深刻的内涵。
1. TCP协议的3次握手流程在进行网络通信时,客户端和服务器之间需要建立可靠的连接,而TCP协议的3次握手过程正是用来确保连接的建立稳定和可靠。
具体的流程如下:第一步:客户端向服务器发送一个带有SYN标志的数据包,表示请求建立连接。
第二步:服务器收到客户端的SYN数据包后,向客户端发送一个带有SYN/ACK标志的数据包,表示确认收到客户端的请求,并且自己也请求建立连接。
第三步:客户端收到服务器的SYN/ACK数据包后,向服务器发送一个带有ACK标志的数据包,表示确认服务器的请求。
通过这3次握手,客户端和服务器就建立了可靠的连接,可以进行数据的传输和通信。
2. TCP协议的4次挥手流程与3次握手相对应的是TCP协议的4次挥手过程,用于断开已建立的连接,确保连接的释放稳定和可靠。
具体的流程如下:第一步:当客户端需要关闭连接时,向服务器发送一个带有FIN标志的数据包,表示自己已经完成数据发送。
第二步:服务器收到客户端的FIN数据包后,向客户端发送一个带有ACK标志的数据包,表示已经收到客户端的请求。
第三步:在服务器完成数据传输后,向客户端发送一个带有FIN标志的数据包,表示自己也已经完成数据发送。
第四步:客户端收到服务器的FIN数据包后,向服务器发送一个带有ACK标志的数据包,表示确认收到服务器的请求,至此连接断开。
通过以上4次挥手,客户端和服务器完成了连接的释放,确保了连接的安全关闭。
总结回顾:通过深入地了解TCP协议的3次握手和4次挥手流程,我们可以更好地掌握网络通信中连接的建立和释放的关键环节,确保数据的安全传输和通信的稳定性。
在实际应用中,我们需要根据具体场景和需求来灵活运用这些知识,以达到最佳的通信效果。
三次握手实验步骤
三次握⼿实验步骤1.开始→运⾏→CMD,在弹出的命令⾏窗⼝中输⼊ping ***,***代表要抓包的⽹址,如,此时会将⽹址转换为IP地址,如百度的IP地址为:39.156.66.18。
2.打开软件Wireshark,点击“Capture”→“Start”,开始抓包。
3.打开浏览器,输⼊刚才ping的那个⽹址,即要抓包的⽹址,如,等⼀段时间,待数据传输完成后,关闭该⽹页,回到Wireshark,再等⼀段时间,点击“Capture”→“Stop”,停⽌抓包。
4.设置过滤器,筛选所抓到的包。
由于在打算建⽴TCP连接时,客户端向服务器发出连接请求报⽂段,此时⾸部中的同步位SYN=1,所以只需找SYN=1的数据包即可。
点击右上⾓的“Filter”→“Expression”→“TCP”→“tcp.flags.syn == 1”→“Apply”,此时过滤完成。
5.找到Destination⼀栏即⽬的⽹址的IP地址为39.156.66.18的那⾏数据,单击选中该⾏数据,点击“Clear”,清除过滤器,此时数据包按抓到的先后顺序排列,往后找,⼀直找到剩下的两次握⼿为⽌。
三次握⼿的标志分别为:SYN=1、SYN=1,ACK=1、ACK=1。
⼀定要注意找到的三次握⼿属于同⼀临时端⼝号。
三次握⼿结果如下:6.寻找四次挥⼿。
记住三次握⼿中的临时端⼝号,即上图中的63237,设置过滤器,点击右上⾓的“Filter”→“Expression”→“TCP”→“tcp.flags.fin == 1”→“Apply”,此时过滤完成。
在过滤完成后,找到端⼝号为第⼀个63237的帧,点击“Clear”,如下图:四次挥⼿结果如下:。
简述TCP的三次握手过程
简述TCP的三次握⼿过程TCP在中,提供可靠的连接服务,采⽤三次握⼿建⽴⼀个连接.第⼀次握⼿:建⽴连接时,客户端发送syn包(syn=j)到服务器,并进⼊SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)第⼆次握⼿:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时⾃⼰也发送⼀个SYN包(syn=k),即SYN+ACK包,此时服务器进⼊状态;第三次握⼿:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进⼊ESTABLISHED状态,完成三次握⼿.完成三次握⼿,客户端与服务器开始传送数据A与B建⽴TCP连接时:⾸先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的⼀次连接(三次握⼿)的过程就建⽴了!⼀、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等,具体含义如下:(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收⽅应该尽快将这个报⽂交给应⽤层。
(D)RST:重置连接。
(E)SYN:发起⼀个新连接。
(F)FIN:释放⼀个连接。
需要注意的是:(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认⽅Ack=发起⽅Seq+1,两端配对。
⼆、三次握⼿所谓三次握⼿(Three-Way Handshake)即建⽴TCP连接,就是指建⽴⼀个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建⽴。
一文彻底搞懂TCP三次握手、四次挥手过程及原理
⼀⽂彻底搞懂TCP三次握⼿、四次挥⼿过程及原理TCP 协议简述TCP 提供⾯向有连接的通信传输,⾯向有连接是指在传送数据之前必须先建⽴连接,数据传送完成后要释放连接。
⽆论哪⼀⽅向另⼀⽅发送数据之前,都必须先在双⽅之间建⽴⼀条连接。
在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握⼿进⾏初始化的。
同时由于TCP协议是⼀种⾯向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双⼯模式,所以需要四次挥⼿关闭连接。
TCP包⾸部⽹络中传输的数据包由两部分组成:⼀部分是协议所要⽤到的⾸部,另⼀部分是上⼀层传过来的数据。
⾸部的结构由协议的具体规范详细定义。
在数据包的⾸部,明确标明了协议应该如何读取数据。
反过来说,看到⾸部,也就能够了解该协议必要的信息以及所要处理的数据。
包⾸部就像协议的脸。
所以我们在学习TCP协议之前,⾸先要知道TCP在⽹络传输中处于哪个位置,以及它的协议的规范,下⾯我们就看看TCP⾸部的⽹络传输起到的作⽤:下⾯的图是TCP头部的规范定义,它定义了TCP协议如何读取和解析数据:TCP⾸部承载这TCP协议需要的各项信息,下⾯我们来分析⼀下:TCP端⼝号TCP的连接是需要四个要素确定唯⼀⼀个连接:(源IP,源端⼝号)+ (⽬地IP,⽬的端⼝号)所以TCP⾸部预留了两个16位作为端⼝号的存储,⽽IP地址由上⼀层IP协议负责传递源端⼝号和⽬地端⼝各占16位两个字节,也就是端⼝的范围是2^16=65535另外1024以下是系统保留的,从1024-65535是⽤户使⽤的端⼝范围TCP的序号和确认号:32位序号 seq:Sequence number 缩写seq ,TCP通信过程中某⼀个传输⽅向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,⽐如现在序列号为1000,发送了1000,下⼀个序列号就是2000。
32位确认号 ack:Acknowledge number 缩写ack,TCP对上⼀次seq序号做出的确认号,⽤来响应TCP报⽂段,给收到的TCP报⽂段的序号seq 加1。
tcp三次握手及流程
tcp三次握手及流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!TCP三次握手:理解网络连接的基石在计算机网络的世界中,TCP(传输控制协议)是保证数据可靠传输的重要协议。
抓包及TCP三次握手分析
课程设计课程名称计算机网络实验题目名称分析TCP三次握手学生学院计算机学院2014年01月05 日一、实验目的TCP是可靠的传输,在通信之前要通过三次握手建立链接。
通过实验掌握TCP三次握手的过程。
二、实验原理1、TCP的三次连接分析在TCP报文头有6种标志位:URG(urgent紧急),ACK(acknowledgement 确认),PSH(push传送),RST(reset重置),SYN(synchronous建立联机) ,FIN(finish结束) 。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;标志位: 0 0 0 0 1 0URG 0 0 0 0 0 0ACK 0 0 0 0 0 0PSH 0 0 0 0 0 0RST 0 0 0 0 0 0SYN 0 0 0 0 1 0FIN 0 0 0 0 0 0第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;标志位: 0 1 0 0 1 0URG 0 0 0 0 0 0ACK 0 1 0 0 0 0PSH 0 0 0 0 0 0RST 0 0 0 0 0 0SYN 0 0 0 0 1 0FIN 0 0 0 0 0 0第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据.标志位: 0 1 0 0 0 0URG 0 0 0 0 0 0ACK 0 1 0 0 0 0PSH 0 0 0 0 0 0RST 0 0 0 0 0 0SYN 0 0 0 0 0 0FIN 0 0 0 0 0 02、抓包的筛选规则3、分析TCP三次连接的规律x Syn报文序号:0x3 d08309d 确认号:0y Syn Ack报文序号:0x4 6 fc1db3 确认号:0x3 e 08309dy+1 Ack报文序号:0x3e08309d确认号:0x4 7 fc1db3三、实验平台1、win7旗舰版2、VS20103、WpdPack_4_1_2和WinPcap_4_1_2四、实验配置l 、添加头文件目录项目->配置属性-> VC++目录->包含目录->添加WinPcap开发包中的Include目录2、添加库文件目录项目->配置属性-> VC++目录->包含目录->添加WinPcap开发包中的Lib目录,如下图所示:3、增加与WinPcap有关的预处理定义项目->配置属性->C/C++->预处理器->点击右边的下拉按钮->添加WPCAP和HA VE_REMOTE,如下图5、添加wpcap.lib库文件项目->配置属性->连接器->命令行->其他选项框中添加“wpcap.lib ws2_32.lib”,如下图6、添加pcap.h头文件在使用WinPcap API的所有源文件中添加#include "pcap.h”五、总体设计1、项目类型本软件是“MFC应用程序”中的“基于对话框”2、界面设计3、功能函数afx_msg void OnBnClickedButtonStop();afx_msg void OnBnClickedButtonExit();afx_msg void OnBnClickedAbout();afx_msg void OnItemchangedListPacket(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnNMCustomdrawListPacket(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnBnClickedButtonShowShakeHand();afx_msg void OnItemchangingListShowShakeHand(NMHDR *pNMHDR, LRESULT *pResult);int initCap();int startCap();int updateTree(int index);seq,int index,int group);Ptr_Analysis_List AddNote(int seq,int ack,int position, Ptr_Analysis_List head);int analyze_frame(const u_char * pkt,struct datapkt * data,struct pktcount*npakcet);int analyze_ip(const u_char* pkt,struct datapkt *data,struct pktcount *npakcet);int analyze_ip6(const u_char* pkt,struct datapkt *data,struct pktcount*npakcet);int analyze_tcp(const u_char* pkt,struct datapkt *data,struct pktcount*npakcet);4、捕获数据包流程六、1、协议头文件 Protocol.h//Mac帧头占14个字节typedef struct ethhdr{u_char dest[6]; //6个字节目标地址u_char src[6]; //6个字节源地址u_short type; //2个字节类型};//定义IP头typedef struct iphdr{#if defined(LITTLE_ENDIAN)u_char ihl:4; //首部长度u_char version:4;#elif defined(BIG_ENDIAN)u_char version:4;u_char ihl:4;#endifu_char tos; //TOS 服务类型u_short tlen; //包总长 u_short占两个字节u_short id; //标识u_short frag_off; //片位移u_char ttl; //生存时间u_char proto; //协议u_short check; //校验和u_int saddr; //源地址u_int daddr; //目的地址u_int op_pad; //选项等};//定义TCP头typedef struct tcphdr{u_short sport; //源端口地址 16位u_short dport; //目的端口地址u_int seq; //序号 32位u_int ack_seq; //确认序号#if defined(LITTLE_ENDIAN)u_short rest1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,rest2:2;#elif defined(BIG_ENDIAN)u_short doff:4,rest1:4,rest2:2,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;#endifu_short window; //窗口大小 16位u_short check; //检验和 16位u_short urg_ptr; //紧急指针u_int opt; //选项};//定义IPv6typedef struct iphdr6{//#if defined(BIG_ENDIAN)u_int version:4, //版本flowtype:8, //流类型flowid:20; //流标签u_short plen; //有效载荷长度u_char nh; //下一个头部u_char hlim; //跳限制u_short saddr[8]; //源地址u_short daddr[8]; //目的地址};//对各种包进行计数typedef struct pktcount{int n_ip;int n_ip6;int n_tcp;int n_http;int n_sum;};///////////////////////////////////////////////////////////////// ///////////要保存的数据结构typedef struct datapkt{char pktType[8]; //包类型int time[6]; //时间int len; //长度struct ethhdr* ethh; //链路层包头struct iphdr* iph; //IP包头struct iphdr6* iph6; //IPV6struct tcphdr* tcph; //TCP包头void *apph; //应用层包头};2、int initCap()//初始化wincapint CThreeSHOfTCPDlg::initCap(){devCount = 0;if(pcap_findalldevs(&alldev,errbuf) == -1)return -1;for(dev=alldev;dev;dev = dev->next)devCount ++;return 0;}3、int startCap()//开始捕获数据包int CThreeSHOfTCPDlg::startCap(){int if_index,filter_index,count; //if_index是接口索引u_int netmask;struct bpf_program fcode;initCap();//获得接口和过滤器索引if_index = m_comboboxNetCard_Port.GetCurSel();filter_index = m_comboboxRule.GetCurSel();if(0 == if_index || CB_ERR == if_index){AfxMessageBox(_T("请选择一个合适的网卡接口"));return -1;}if(CB_ERR == filter_index){AfxMessageBox(_T("过滤器选择错误"));return -1;}//获得选中的网卡接口dev = alldev;for(count = 0; count < if_index - 1; count++)dev = dev->next;if((adhandle = pcap_open_live(dev->name,65536, //捕获数据包长度1, // 混杂模式 (非0意味着是混杂模式)1000, // 读超时设置errbuf // 错误信息)) == NULL){AfxMessageBox(_T("无法打开接口:"));pcap_freealldevs(alldev);return -1;}//检查是否为以太网if(pcap_datalink(adhandle) != DLT_EN10MB){AfxMessageBox(_T("这不适合于以太网的网络!"));pcap_freealldevs(alldev);return -1;}if(dev->addresses != NULL)netmask = ((struct sockaddr_in *)(dev->addresses->netmask))->sin_addr.S_un.S_addr;elsenetmask=0xffffff;//编译过滤器if(0 == filter_index){char filter[] = "tcp";if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 ){AfxMessageBox(_T("语法错误,无法编译过滤器"));pcap_freealldevs(alldev);return -1;}}else{CString str;char *filter;int len,x;m_comboboxRule.GetLBText(filter_index,str);len = str.GetLength()+1;filter = (char*)malloc(len);for(x=0;x<len;x++){filter[x] = str.GetAt(x);}if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 ){AfxMessageBox(_T("语法错误,无法编译过滤器"));pcap_freealldevs(alldev);return -1;}}//设置过滤器if(pcap_setfilter(adhandle,&fcode)<0){AfxMessageBox(_T("设置过滤器错误"));pcap_freealldevs(alldev);return -1;}pcap_freealldevs(alldev);//设置数据包存储路径CFileFind file;char thistime[30];struct tm* ltime;memset(filepath,0,512);memset(filename,0,64);if(!file.FindFile(_T("SaveData")))CreateDirectory(_T("SaveData"),NULL);time_t nowtime;time(&nowtime);ltime = localtime(&nowtime);strftime(thistime,sizeof(thistime),"%Y%m%d %H%M%S",ltime); strcpy(filepath,"SaveData\\"); //在当前目录下strcat(filename,thistime); //时间为2014-1-2:11-12-03,则文件名字为20140102111203.lixstrcat(filename,".lix");//调用pcap_dump_open()先创建一个文件,捕获的数据将会存储到此文件中,后面捕获的数据包将会实时地写入一个临时文件strcat(filepath,filename);dumpfile = pcap_dump_open(adhandle,filepath);if(dumpfile==NULL){MessageBox(_T("文件创建错误!"));return -1;}//接收数据,新建线程处理LPDWORD threadCap=NULL;m_ThreadHandle=CreateThread(NULL,0,captureThread,this,0,th readCap);if(m_ThreadHandle==NULL){int code=GetLastError();CString str;str.Format(_T("创建线程错误,代码为%d."),code);AfxMessageBox(str);return -1;}return 1;}4、DWORD WINAPI captureThread(LPVOID lpParameter)//抓包线程DWORD WINAPI captureThread(LPVOID lpParameter){int res,nItem;struct tm *ltime;CString timestr,buf,srcMac,destMac;time_t local_tv_sec;struct pcap_pkthdr *header; //数据包头const u_char *pkt_data=NULL,*pData=NULL; //网络中收到的字节流数据u_char *ppkt_data;CThreeSHOfTCPDlg *pthis = (CThreeSHOfTCPDlg*) lpParameter;if(NULL == pthis->m_ThreadHandle){MessageBox(NULL,_T("线程句柄错误"),_T("提示"),MB_OK);return -1;}//从interface或离线记录文件获取一个报文 1: 成功 0: 获取报文超时 -1: 发生错误 -2: 获取到离线记录文件的最后一个报文while((res = pcap_next_ex( pthis->adhandle, &header, &pkt_data)) >= 0){if(res == 0) //超时continue;struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt));memset(data,0,sizeof(struct datapkt));if(NULL == data){MessageBox(NULL,_T("空间已满,无法接收新的数据包"),_T("Error"),MB_OK);return -1;}//分析出错或所接收数据包不在处理范围内if(analyze_frame(pkt_data,data,&(pthis->npacket))<0) continue;//将数据包保存到打开的文件中if(pthis->dumpfile!=NULL){pcap_dump((unsignedchar*)pthis->dumpfile,header,pkt_data);}//将本地化后的数据装入一个链表中,以便后来使用ppkt_data = (u_char*)malloc(header->len);memcpy(ppkt_data,pkt_data,header->len);pthis->m_localDataList.AddTail(data);pthis->m_netDataList.AddTail(ppkt_data);//预处理,获得时间、长度data->len = header->len; //链路中收到的数据长度local_tv_sec = header->_sec;ltime = localtime(&local_tv_sec);data->time[0] = ltime->tm_year+1900;data->time[1] = ltime->tm_mon+1;data->time[2] = ltime->tm_mday;data->time[3] = ltime->tm_hour;data->time[4] = ltime->tm_min;data->time[5] = ltime->tm_sec;//为新接收到的数据包在listControl中新建一个itembuf.Format(_T("%d"),pthis->npkt);nItem = pthis->m_listPacket.InsertItem(pthis->npkt,buf);//显示时间戳timestr.Format(_T("%d/%d/%d %d:%d:%d"),data->time[0],data->time[1],data->time[2],data->time[3],data->time[4],da ta->time[5]);pthis->m_listPacket.SetItemText(nItem,1,timestr);//显示长度buf.Empty();buf.Format(_T("%d"),data->len);pthis->m_listPacket.SetItemText(nItem,2,buf);//显示源MACbuf.Empty();buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->src[0],data->ethh->src[1],data->ethh->src[2],data->ethh->src[3],data->ethh->src[4],d ata->ethh->src[5]);pthis->m_listPacket.SetItemText(nItem,3,buf);//显示目的MACbuf.Empty();buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->dest[0],data->ethh->dest[1],data->ethh->dest[2],data->ethh->dest[3],data->ethh->dest[4 ],data->ethh->dest[5]);pthis->m_listPacket.SetItemText(nItem,4,buf);//获得协议pthis->m_listPacket.SetItemText(nItem,5,CString(data->pktT ype));//获得源IPbuf.Empty();if(0x0800 == data->ethh->type) { //IPV4struct in_addr in;in.S_un.S_addr = data->iph->saddr;buf = CString(inet_ntoa(in));}else if(0x86dd ==data->ethh->type ){ //IPV6int n;for(n=0;n<8;n++){if(n<=6)buf.AppendFormat(_T("%02x:"),data->iph6->saddr[n]);elsebuf.AppendFormat(_T("%02x"),data->iph6->saddr[n]);}}pthis->m_listPacket.SetItemText(nItem,6,buf);//获得目的IPbuf.Empty();if(0x0800 == data->ethh->type){ //IPV4 struct in_addr in;in.S_un.S_addr = data->iph->daddr;buf = CString(inet_ntoa(in));}else if(0x86dd ==data->ethh->type ){ //IPV6int n;for(n=0;n<8;n++){if(n<=6)buf.AppendFormat(_T("%02x:"),data->iph6->daddr[n]);elsebuf.AppendFormat(_T("%02x"),data->iph6->daddr[n]);}}pthis->m_listPacket.SetItemText(nItem,7,buf);//对包计数pthis->npkt++;}return 1;}5、int analyze_frame(…)//分析链路层int analyze_frame(const u_char * pkt,struct datapkt * data,struct pktcount *npacket){int i;struct ethhdr *ethh = (struct ethhdr*)pkt;data->ethh = (struct ethhdr*)malloc(sizeof(struct ethhdr));if(NULL == data->ethh)return -1;for(i=0;i<6;i++){data->ethh->dest[i] = ethh->dest[i];data->ethh->src[i] = ethh->src[i];}npacket->n_sum ++;/*由于网络字节顺序原因,需要对*/data->ethh->type = ntohs(ethh->type); //ntohs()的作用是将网络数据格式转换为short型的主机上的数据格式//处理IP包switch(data->ethh->type){case 0x0800:return analyze_ip((u_char*)pkt+14,data,npacket);break;case 0x86dd:return analyze_ip6((u_char*)pkt+14,data,npacket);break;default:return -1;break;}return 1;}6、int analyze_ip(…)//分析网络层:IPint analyze_ip(const u_char* pkt,datapkt *data,struct pktcount *npacket){int i;struct iphdr *iph = (struct iphdr*)pkt;data->iph = (struct iphdr*)malloc(sizeof(struct iphdr));if(NULL == data->iph)return -1;data->iph->check = iph->check;npacket->n_ip++;data->iph->saddr = iph->saddr;data->iph->daddr = iph->daddr;data->iph->frag_off = iph->frag_off;data->iph->id = iph->id;data->iph->proto = iph->proto;data->iph->tlen = ntohs(iph->tlen);data->iph->tos = iph->tos;data->iph->ttl = iph->ttl;data->iph->ihl = iph->ihl;data->iph->version = iph->version;data->iph->op_pad = iph->op_pad;int iplen = iph->ihl*4; //ip头长度switch(iph->proto){case PROTO_TCP:return analyze_tcp((u_char*)iph+iplen,data,npacket);break;default :return-1;break;}return 1;}7、int analyze_ip6(…)//分析网络层:IPV6int analyze_ip6(const u_char* pkt,datapkt *data,struct pktcount *npacket){int i;struct iphdr6 *iph6 = (struct iphdr6*)pkt;data->iph6 = (struct iphdr6*)malloc(sizeof(struct iphdr6));if(NULL == data->iph6)return -1;npacket->n_ip6++;data->iph6->version = iph6->version;data->iph6->flowtype = iph6->flowtype;data->iph6->flowid = iph6->flowid;data->iph6->plen = ntohs(iph6->plen);data->iph6->nh = iph6->nh;data->iph6->hlim =iph6->hlim;for(i=0;i<16;i++){data->iph6->saddr[i] = iph6->saddr[i];data->iph6->daddr[i] = iph6->daddr[i];}switch(iph6->nh){case 0x06:return analyze_tcp((u_char*)iph6+40,data,npacket);break;;default :return-1;break;}return 1;}8、int analyze_tcp(…)/*分析传输层:TCP*/int analyze_tcp(const u_char* pkt,datapkt *data,struct pktcount *npacket){struct tcphdr *tcph = (struct tcphdr*)pkt;data->tcph = (struct tcphdr*)malloc(sizeof(struct tcphdr));if(NULL == data->tcph)return -1;data->tcph->ack_seq = tcph->ack_seq;data->tcph->check = tcph->check;data->tcph->doff = tcph->doff;data->tcph->rest1 = tcph->rest1;data->tcph->rest2 = tcph->rest2;data->tcph->urg = tcph->urg;data->tcph->ack = tcph->ack;data->tcph->psh = tcph->psh;data->tcph->rst = tcph->rst;data->tcph->syn = tcph->syn;data->tcph->fin = tcph->fin;data->tcph->dport = ntohs(tcph->dport);data->tcph->seq = tcph->seq;data->tcph->sport = ntohs(tcph->sport);data->tcph->urg_ptr = tcph->urg_ptr;data->tcph->window= tcph->window;data->tcph->opt = tcph->opt;/////////////////////*不要忘记http分支*/////////////////////////if(ntohs(tcph->dport) == 80 || ntohs(tcph->sport)==80){npacket->n_http++;strcpy(data->pktType,"HTTP");}else{npacket->n_tcp++;strcpy(data->pktType,"TCP");}return 1;}七、实验效果选择网卡,本人使用的网卡如图所选,若选用其他网卡接口,则不会抓到包抓包功能测试展示某个数据包的信息三次握手功能测试八、实验总结通过此次做课程设计,使我加深计算机网络课程上所学习的知识的理解,掌握协议的实现方法及应用。
实验4-捕获并分析TCP数据包和TCP三次握手及四次挥手过程
实验四捕获并分析TCP数据包和TCP三次握手和四次挥手过程一、实验目的通过网络嗅探器软件对网络数据进行监听和分析,加深对计算机网络中各层协议数据单元PDU的形象理解。
二、实验内容1、利用网络嗅探器软件(例如Iris、Sniffer、Ethereal、 wireshark等),获取TCP数据包,记录并分析各字段的含义。
2、打开一个网站,截取TCP数据包(至少三个),分析TCP三次握手建立连接和四次挥手释放连接的过程。
三、实验步骤1、安装数据包捕获软件wireshark。
2、启动捕获软件。
(1)开始捕获数据报:(2)打开一个网站,例:(3)对捕获的TCP数据包进行分析,并保存(4)对捕获的TCP三次握手建立连接的几个数据包进行分析,分别说明各数据包代表的意义和所属的三次握手的第几次。
四、实验分析1、设置显示过滤,只显示源地址是本机的http数据包,说明如何进行设置?答:若要设置只显示源地址是本机的http数据包,需使用以下ip.src==本机IP && http 2、点开软件捕获界面中包详细信息栏的TCP数据包:若想查看TCP数据包的内容,需点击前面的加号,则显示TCP报文段各字段的结构如下图所示:对照课本P202页:TCP报文段的结构图,如下图示:分析并记录说明,所捕获的数据包的在运输层TCP报文段中各字段的具体信息:①源端口号:49896。
每一个应用进程在运输层都对应一个端口号。
端口是运输层与应用层的服务接口。
运输层的复用和分用功能都要通过端口才能实现。
②目的端口号:80。
说明发送方请求的是一个web服务(http).③序号:0。
为了对发送的报文段进行可靠传输,对每个发送的报文段的第一个字节都进行编号,称为序号。
例如:一个报文段的序号值为301,携带的数据长度100字节;则下一个报文段的序号为401.④确认号:0。
为了告诉发送方,到目前为止,接收方按顺序接收的报文段达到多少,将下一个期望接收的报文段的第一个字节的编号作为确认号发给发送方。
TCP三次握手过程分析
TCP三次握手过程分析1.客户端向服务器发送请求连接的SYN包:-客户端选择一个初始的序列号并将其包含在SYN包中。
-客户端将该SYN包发送给服务器,并标记为SYN标志位为1,ACK标志位为0。
2.服务器收到SYN包后进行处理:-服务器接收到SYN包后,会首先检查SYN标志位是否为1,并确认SYN包中的序列号。
-服务器准备一个响应SYN包的ACK包,并将确认号设置为客户端的序列号加一-服务器还会选择自己的初始序列号,并将其包含在ACK包中。
-服务器将该ACK包发送给客户端,并标记ACK标志位为13.客户端收到服务器的ACK包后进行处理:-客户端接收到ACK包后,会首先检查ACK标志位是否为1,并确认ACK包中的确认号是否正确。
-客户端还会检查序列号是否正确,并将序列号设置为服务器的确认号加一-客户端生成另一个ACK包,并将其发送给服务器,标记ACK标志位为1该三次握手过程的具体步骤如下:- 客户端发送一个SYN标志位为1的TCP数据包给服务器,同时指定客户端初始化序列号Seq=x。
- 服务器收到该SYN数据包后,会发送一个SYN标志位为1,ACK标志位为1的ACK数据包给客户端,同时指定服务器初始化序列号Seq=y,确认号Ack=x+1- 客户端收到服务器的ACK数据包后,会再次发送一个ACK数据包给服务器,确认号Ack=y+1-服务器收到最后一个ACK数据包后,连接建立成功,TCP三次握手完成。
三次握手的目的是为了保证客户端和服务器双方都能够发送和接收数据,同时确保数据的可靠性。
通过三次握手,可以避免请求的SYN包和响应的ACK包在网络中丢失和重复的问题。
同时,三次握手还可以防止已经失效的连接请求报文段突然又传送到了服务器,从而产生错误。
TCPIP三次握手的过程和抓包分析原理
数据内容 含义
TCP 使用类似的握手过程来结束连接。这可确保两个主机均能完成传输并确保所有的数据均得以接收
TCP Client Flags TCP Server
1 Send SYN (seq=x) ----SYN---> SYN Received
2 SYN/ACK Received ACK Received, Connection Established
现在,我们来看一个完整的流程,在一个TCP socket上系统调用connect究竟是如何建立起一个到对端的连接的。我们还是以实验环境172.16.48.2向172.16.48.1的端口5002发起连接请求为例。
第一步,172.16.48.2向172.16.48.1发起连接请求,发送一个SYN段,指明目的端口5002,通告自己的初始序号(ISN,由协议栈 随机产生的一个32位数),设置确认序号为0(因为还没有收到过对端的数据),通告自己的滑动窗口大小为5840(对端是5792,这似乎有问题,有待进 一步细查),窗口扩大因子为2(在首部选项中),通告最大报文段长度为1460(本地局域网),下面是数据内容(已剥去链路层的以太网首部和网络层的IP 首部):
98 8e 40 92 确认序号(对端ISN+1)
8 首部长度(8*4=32,有12字节的选项)
0 10 标志,ACK=1
TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012年1月MVP申请倒计时——13日截止“IT适合你吗?”智力挑战tcpdump抓包分析TCP三次握手过程分类:TCP/IP与套接字编程2010-10-09 15:11 566人阅读评论(0) 收藏举报转:/xxjjyy2008/blog/item/e6566bf837d91903d9f9fdd0.html一、tcpdump使用1、首先看下MAN手册TCPDUMP(8)NAMEtcpdump - dump traffic on a networkSYNOPSIStcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ][ -C file_size ] [ -F file ][ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] [ -T type ] [ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ] [ -Z user ][ expression ]选项:-A 以ASCII码显示消息包-c 指定包个数-C 配合-w,当写入文件时,先检查文件大小是否已经超过1M,若超过,生成新文件,文件名为指定文件名加后缀1。
-d 将匹配信息包的代码以人们能够理解的汇编格式给出-dd 将匹配信息包的代码以c语言程序段的格式给出-ddd 将匹配信息包的代码以十进制的形式给出。
-D 列出可以抓包的所有网络接口-e 显示链路层内容-f 外部的IP以数字方式显示-i 指定网络接口-l 使标准输出变为缓冲行形式-n IP,端口用数字方式显示-t 在输出的每一行不打印时间戳;-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;-vv 输出详细的报文信息;-c 在收到指定的包的数目后,tcpdump就会停止;-F 从指定的文件中读取表达式,忽略其它的表达式;-i 指定监听的网络接口;-r 从指定的文件中读取包(这些包一般通过-w选项产生);-w 直接将包写入文件中,并不分析和打印出来;-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)-x 让十六进制显示包内容2、过滤(1)指定接口(-i)如:tcpdump -i eth0(2)指定IP地址(host),可以辅加and , or ,!等逻辑符,以及src,dest等表示方向。
如:tcpdump host 192.168.1.23 捕获192.168.1.23发出或者收到的包tcpdump -A host 192.168.1.90 and /( 192.168.1.104 or 192.168.1.105 /) 捕获192.168.1.23与192.168.1.104或者192.168.1.105之间往来的包tcpdump host ! 192.168.1.23 捕获除192.168.1.23以外所有主机的包tcpdump -A src 192.168.1.90 and dst 192.168.1.104 指定从90发往104的包(3)指定端口(port)如:tcpdump port 80 指定捕获80端口的包(4)指定协议( 协议包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp)如:tcpdump tcp 指定捕获TCP包(5)其它(gateway, broadcast, less, greater)如:tcpdump broadcast 所有广播包二、三次握手过程分析用netstat -an | grep LISTEN看一下,当前主机正在监听的端口,使用另一台机telnet过来,不输入任何内容,进行抓包。
我们这里以6000为例tcpdump port 6000 -c 3 -n内容如下:21:07:17.790296 IP 192.168.1.104.2511 > 192.168.1.90.6000: S3359422806:3359422806(0) win 64240 <mss1460,nop,nop,sackOK>21:07:17.790317 IP 192.168.1.90.6000 > 192.168.1.104.2511: S3675079922:3675079922(0) ack 3359422807 win5840 <mss 1460,nop,nop,sackOK> 21:07:17.790675 IP 192.168.1.104.2511 > 192.168.1.90.6000: . ack 1 win 64240我们来对第一个包进行分析:21:07:17(时间).790296(ID号)IP (协议)192.168.1.104.2511 > 192.168.1.90.6000: (源IP,端口,目的IP,端口)中间>表示方向S (表示为SYN包,即发起连接包紧急指针— URG确认序号有效—ACK接收方应该尽快将这个报文段交给应用层—PSH重建连接—RST同步序号用来发起一个连接—SYN发端完成发送任务—IN)3359422806:3359422806(0) (IP包序号,相对序号为0)win 64240 (数据窗口大小,告诉对方本机接收窗口大小,windows下默认为64240,可通过setsockopt动态修改,同样可以通过修改注册表项(HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Paramet ers的TCPWindowSize)来更改默认值)<mss1460,nop,nop,sackOK> 对应TCP包头中的选项字段MSS: Maxitum Segment Size 最大分段大小,MSS表示TCP传往另一端的最大块数据的长度。
当一个连接建立时,连接的双方都要通告各自的MSS。
如果一方不接收来自另一方的MSS值,则MSS就定为默认的536字节。
以上三个包正好是TCP连接的三次握手过程:(1)A主机发送序号为3359422806的SYN包到B,同时带有自身的WIN和MSS大小。
(2)B主机收到后,发送SYN+ACK的返回包到A,也带自身的WIN和MSS 大小,3675079922,同时为为上一个包的应答包3359422807。
(3)A主机返回ACK,包序号为1(相对序号,如果需要看绝对序号,可以在tcpdump命令中加-S)然后我们再来分析一下包的具体内容:我们在tcpdump命令中加-x选项,后可得到如下内容:22:07:13.436638 IP 192.168.1.104.2799 > 192.168.1.90.6000: S3480877812:3480877812(0) win 64240 <mss 1460,nop,nop,sackOK> 0x0000: 4500 0030 b195 4000 8006 c51f c0a8 01680x0010: c0a8 015a 0aef 1770 cf79 faf4 0000 00000x0020: 7002 faf0 174e 0000 0204 05b4 0101 040222:07:13.436675 IP 192.168.1.90.6000 > 192.168.1.104.2799: S4226616929:4226616929(0) ack 3480877813 win 5840 <mss 1460,nop,nop,sackOK> 0x0000: 4500 0030 0000 4000 4006 b6b5 c0a8 015a0x0010: c0a8 0168 1770 0aef fbed 0e61 cf79 faf50x0020: 7012 16d0 f10e 0000 0204 05b4 0101 040222:07:13.437019 IP 192.168.1.104.2799 > 192.168.1.90.6000: . ack 1 win 64240 0x0000: 4500 0028 b196 4000 8006 c526 c0a8 01680x0010: c0a8 015a 0aef 1770 cf79 faf5 fbed 0e620x0020: 5010 faf0 39b2 0000还是一样,我们对第一个包进行分析,第一个包为SYN包,应该为一个空包,即只包括IP头和TCP头。
IP包头4 -IP版本号IPV45 -IP包头长度5个32字节00 -TOS (000 0000 0)前三个BIT优先权,现已忽略;4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,均为0表示一般服务;最后1BIT未用。
0030 -总长度,48个字节b195 -包唯一标识4000 -标志字段,和片偏移,用于分片80 -TTL(128)06 -协议TCPc51f -MACc0a8 0168 -SRC IP,可以inet_ntoa转换成点号分隔的IP。
c0a8 015a -DST IPTCP包头0aef -源端口,十进制为27991770 -目的端口,十进制为6000cf79 faf4 包序号,十进制为2175548630000 0000 确认序号,0,未设置ACK,确认序号无效7002 -TCP包头长度,标志位。
(0111 000000 000010)前4bitTCP长度7个32BIT,中间6bit保留,后6bit为标志位(URG, ACK,PSH,RST,SYN,FIN),可以看出设置了倒数第二位,SYN位。
faf0 -窗口大小,十进制为64240174e -校验和,覆盖了整个的T C P报文段: T C P首部和T C P数据0000 -紧急指针,只有当URG标志置1时紧急指针才有效0204 05b4 0101 0402 -选项字段,8个字节。