转至 http://zoukejian.blog.51cto.com/131276/57141
TCP/IP协议和抓包
1. 数据包
1)OSI 参考模型:
起源:没有标准通信协议造成的混乱
目标:定义各种网络节点间的通信的框架
目的:通信标准,解决异种网络互连时所遇到的兼容性问题
优点:各层互不干扰;简化开发;快速定位网路故障
| 层次 | 功能 | 协议 |
数据流 | 应用层 | 应用接口 | HTTP,SMTP, TELNET |
表示层 | 编码和格式转换 | ASCII <-> Unicode | |
会话层 | 会话管理 |
| |
数据段(TCP) | 传输层 | 封装应用层的数据流 | TCP,UDP, ICMP |
数据报(UDP) | 提供端到端的数据传输 | ||
数据包 | 网络层 | 封装传输层的数据段/数据报 | IP,ARP, RIP, EIGRP, OSPF, BGP |
网络寻址和路由 | |||
数据帧 | 数据链路层 | 封装网络层的数据包 |
|
网段内/子网内寻址 | |||
| 物理层 | 物理信号传输 |
|
各层的功能及相关协议:
封装和解封装:
封装: 将上层交给自己的数据包(泛指各种PDU)放进一个或多个本层能理解的数据
包的Data部分,并为这些数据包填充适当的头部字段信息,然后将装配好的数
据包交给下一层。
解封装:从下层接过本层能理解的数据包,然后去掉本层的数据包头部字段,将Data 部
分传给上一层。
2)DOD 模型(TCP/IP 协议族):
3)对应关系
| OSI |
| TCP/IP |
上三层 | 应用层 |
| 应用层 |
表示层 |
| ||
会话层 |
| ||
下四层 | 传输层 |
| 传输层 |
网络层 |
| 互连网络层 | |
数据链路层 |
| 网络接口层 | |
物理层 |
|
4)数据包:
a. TCP 头部:
b. UDP 头部:
c. IP 头部:
(1)服务器应用启动,建立相应的TCB,进入LISTEN状态;
(2)客户端向服务器端发送一个TCP段,该段设置SYN标识,请求跟服务器端应用同步,之后进入SYN-SENT状态,等待服务器端的响应;
(3)服务器端应用收到客户端的SYN 段之后,发送一个TCP段响应客户端,该段设置SYN和ACK标识,告知客户端自己接受它的同步请求,同时请求跟客户端同步。之后进入SYN-RECEIVED状态;
(4)客户端收到服务器端的SYN+ACK段之后,发送一个TCP段,该段设置ACK标识,告知服务器端自己接受它的同步请求。之后,进入ESTABLISHED状态;
(5)服务器端应用收到客户端的ACK段之后,进入ESTABLISHED状态。
到此,客户端跟服务器端的TCP连接就建立起来了。
6)TCP/UDP 协议之比较:
----------------------------------------------------------------------------------------
TCP UDP
----------------------------------------------------------------------------------------
连接建立 面向连接 无连接
提供给应用的数据接口 消息 数据流
可靠性和通告 可靠,使用通告机制 不可靠,不使用通告机制
重传 必要时执行重传 不执行重传
用于管理数据流的特征 用滑动窗口实现流控, 无
启发式窗口大小调整,
拥塞避免算法
开销 大 小
----------------------------------------------------------------------------------------
7) TCP 状态机:
解释:
TCP 连接建立的两种方式:
A)常规的三次握手方式:见5)TCP 协议三次握手过程的描述
B)同步开放方式:
1) 服务器应用启动,建立相应的TCB,进入LISTEN状态;
2)客户端向服务器端发送一个TCP段,该段设置SYN标识,请求跟服
务器端应用同步,之后进入SYN-SENT状态,等待服务器端的响应;
3)服务器端应用收到客户端的SYN 段之后,发送一个TCP段响应客户端,该段设置SYN,告知客户端自己请求跟它同步。之后进入SYN-RECEIVED状态;
4)客户端收到服务器端的SYN段之后,发送一个TCP段,该段
设置ACK标识,告知服务器端自己接受它的同步请求。之后进入SYN-RECEIVED状态;
5)服务器端应用收到客户端的ACK段之后,向客户端发送一个TCP段,
该段设置ACK标识,告知客户端自己接受它的同步请求,进入
ESTABLISHED状态。
6)客户端收到服务器端的ACK段之后,进入ESTABLISHED状态。
到此,客户端跟服务器端的TCP连接就建立起来了。
使用这种方式建立TCP连接的应用比较少。
注意:1)对于服务器端来说,不管使用方式A还是方式B建立连接,它都经历3个状
态:LISTENà SYN-RECEIVEDà ESTABLISHED;而对于客户端来说,就
不一样了。对于方式A,客户端经历2个状态:SYN-SENTà ESTABLISHED,
对于方式B,客户端要经历3个状态:SYN-SENTà SYN-RECEIVED à
ESTABLISHED。
2)对于服务器端来说,当它收到客户端的SYN段之后,不管它是发送
SYN+ACK段响应客户端,还是发送SYN段响应客户端,它都进入到
SYN-RECEIVED状态。
TCP 关闭连接的两种方式:
方式一:(1)客户端向服务器端发送一个FIN段,请求关闭连接。之后进入FIN_WAIT_1状态;
(2)服务器端收到客户端的FIN段之后,发送一个ACK段,响应客户端。之后,进入CLOSE_WAIT 状态;
(3)客户端收到服务器端的ACK段之后,进入FIN_WAIT_2状态。等待服务器端的FIN段。
(4)服务器端等待应用关闭后,发送一个FIN段给客户端。进入LAST_ACK状态。
(5)客户端收到服务器端的FIN段之后,发送一个ACK段响应服务器端。之后进入TIME_WAIT状态。一旦time_wait 计时器超时后,连接就关闭了。
(6)服务器端收到客户端的ACK段之后,连接关闭了。
(2)服务器端收到客户端的FIN段之后,发送一个FIN段,响应客户端。之后,进入CLOSE_WAIT 状态;
(3)客户端收到服务器端的FIN段之后,发送一个ACK段响应服务器端。之后进入CLOSING状态。
(4)服务器端收到客户端的ACK段之后,发送一个ACK段相应客户端。之后关闭连接。
(5)客户端收到服务器端的ACK段之后,进入TIME_WAIT状态。一旦time_wait 计时器超时后,连接就关闭了。
还有其它关闭连接的方式,本文未列出。
8)推荐阅读:The TCP/IP Guide (http://www.tcpipguide.com/free/index.htm)
2. 网络抓包(客户机(ethereal),服务器(tcpdump),网络设备(debug))
3. 故障/异常诊断:
1) PING 不通,不能完成三次握手:
a. 检查路由:route print/ip route list/sh ip route
b. 如果路由OK,ping 网关
c. 如果网关能ping通,tracert/traceroute/traceroute <远程地址>,找出故障位置
2) 完成了三次握手,但是不能正常使用服务
a. 检查服务是否起来了
b. 检查服务是否在你试图连接的地址上监听
c. 检查连接是否被防火墙(网络防火墙,主机防火墙,应用防火墙)干掉了
3) 网络中充斥着大量的SYN 包:
a. 在linux下抓取SYN 包进行分析:tcpdump 'tcp[tcpflags] & (tcp-syn) != 0’ and 'tcp[tcpflags] & (tcp-ack) = 0'
b. 如果可以上65的交换机或者路由器,可以启用TCP 拦截进行跟踪
4. 实际操作: