TCP/IP 协议是一个超级复杂而又庞大是东西, 以后更需要深入学习, 这个文主要记录下三次握手和四次挥手的抓包和简介.
1.TCP/IP
TCP/IP 是不同的通信协议的大集合.
是指能够在多个不同网络间实现信息传输的协议族. TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议, 而是指一个由 FTP,SMTP,TCP,UDP,IP 等协议构成的协议族, 只是因为在 TCP/IP 协议中 TCP 协议和 IP 协议最具代表性, 所以被称为 TCP/IP 协议.
TCP/IP 协议参考 ISO,OSI 模型共有七层, 从下到上分别是物理层, 数据链路层, 网络层, 运输层, 会话层, 表示层和应用层. 但是这显然是有些复杂的, 所以在 TCP/IP 协议中, 它们被简化为了应用层, 传输层, Internet 层, 网络访问层, 四个层次.
2.TCP 报头结构,
1. 源端口, 目标端口, 各占 16 位, 可表示 2^16 个端口
2. 序号 报文的序号
3. 确认号 确认报文, 表示 N-1 之前的报文已经收到, 下次发送报文 N
4. 数据偏移 (4 位, 表示首部的长度, 所以首部最大长度是 60 字节), 保留字段 (6 位),URG,ACK,PSH,RST,SYN,FIN(6 个标记位), 窗口
5. 校验, 紧急指针.
6, 可变选项, 填充
TCP 报头固定长度占 20 个字节.
6 个标志位
URG: 紧急指针位, 当 URG=1 时, 表示紧急指针有效, 属于优先级高的数据. 快速反应.
ACK: 确认 ack, 当 ACK=1 时, 确认字段号才有效, 建立连接的主机 ACK 必须为 1
PSH: 当 PSH=1 时, 接受端应用程序应该立即读取数据, 而不是进入缓冲区.
RST: 当 RST=1 时, 改连接发生严重错误, 释放错误, 需重新建立连接, RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接.
SYN: 建立连接同步, 当 SYN=1 而 ACK=0 时, 表明这是一个连接请求报文段. 对方若同意建立连接, 则应在相应的报文段中使用 SYN=1 和 ACK=1. 因此, SYN 置为 1 就表示这是一个连接请求或连接接受的报文, 只有在前两次握手中 SYN 才置为 1, 带 SYN 标志的 TCP 报文 段称为同步报文段 .
FIN: 用来结束和释放一个连接, 当 FIN=1 时, 通知对面主机表示要结束连接, 结束报文段
窗口: 用于控流, 表示对方发送的数据量, 从本报文段 的确认号开始允许对方发送的数据量, 达到此值, 需要 ACK 确认后才能再继 续传送后面数据, 由 Windows size value * Windows size scaling factor (此值在三次握手阶段 TCP 选项 Windows scale 协商得到) 得出此值 .
校验: 检验范围包括首部和数据两部分, 提供额外的可靠性.
紧急指针: 标记紧急数据在数据字段中的位置 , 指出本报文段中的紧急数据的字节数 (紧急数据结束后就是普通数据). 因此, 紧急指针指出了紧急数据的末尾在报文段中的位置. 当所有紧急数据都处理完时, TCP 就告诉应用程序恢复到正常操作. 值得注意的是, 即使窗口为零时也可发送紧急数据.
可变选项: 最大 40 个字节, TCP 报文首部最大 60 字节, 固定字节 20 个字节
3. 三次握手流程
4 三次握手抓包
软件: Wireshark
通过本地的虚拟机连接
三次握手的包, 第一个包:
第二个包
第三个包
5. 四次挥手过程
四次挥手的三种报文可能
客户端先发送一个 FIN 给服务端, 自己进入了 FIN_WAIT_1 状态, 这时等待接收 服务端的报文, 该报文会有三种可能: ?
只有服务端的 ACK ? 只有服务端的 FIN ? 基于服务端的 ACK, 又有 FIN ?
1, 只收到服务器的 ACK, 客户端会进入 FIN_WAIT_2 状态, 后续当收到服务端 的 FIN 时,
回应发送一个 ACK, 会进入到 TIME_WAIT 状态, 这个状态会持续 2MSL(TCP 报文段在网络中的最大生存时间, RFC 1122 标准的建议值是 2min).
客户端等待 2MSL, 是为了当最后一个 ACK 丢失时, 可以再发送一次. 因为服务 端在等待超时后会再发送一个 FIN 给客户端, 而客户端知道 ACK 已丢失
2, 只有服务端的 FIN 时, 回应一个 ACK 给服务端, 进入 CLOSING 状态, 然后接 收到服务端的 ACK 时, 进入 TIME_WAIT 状态 ?
3, 同时收到服务端的 ACK 和 FIN, 直接进入 TIME_WAIT 状态
6. 四次挥手抓包
如上, 当客户端发送 FIN 时接收到了服务端的 FIN ,ACK , 客户端发送一个 ACK, 直接进入 time_wait 状态, 等待 2msl, 关闭连接
三次握手四次挥手有限状态机
有限状态机 FSM:Finite State Machine
?CLOSED 没有任何连接状态 ?
LISTEN 侦听状态, 等待来自远方 TCP 端口的连接请求
SYN-SENT 在发送连接请求后, 等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后, 等待对方确认
ESTABLISHED 代表传输连接建立, 双方进入数据传送状态
FIN-WAIT-1 主动关闭, 主机已发送关闭连接请求, 等待对方确认
FIN-WAIT-2 主动关闭, 主机已收到对方关闭传输连接确认, 等待对方发送关闭 传输连接请求
TIME-WAIT 完成双向传输连接关闭, 等待所有分组消失
CLOSE-WAIT 被动关闭, 收到对方发来的关闭连接请求, 并已确认
LAST-ACK 被动关闭, 等待最后一个关闭传输连接确认, 并等待所有分组消失
CLOSING 双方同时尝试关闭传输连接, 等待对方确.
来源: http://www.bubuko.com/infodetail-3258425.html