package org.zarroboogs.smartzpn.tcpip;
import org.zarroboogs.smartzpn.utils.ProxyUtils;
public class TCPHeader {
public static final int FIN = 1;
public static final int SYN = 2;
public static final int RST = 4;
public static final int PSH = 8;
public static final int ACK = 16;
public static final int URG = 32;
static final short offset_src_port = 0; // 16位源端口
static final short offset_dest_port = 2; // 16位目的端口
static final int offset_seq = 4; // 32位序列号
static final int offset_ack = 8; // 32位确认号
static final byte offset_lenres = 12; // 4位首部长度/4位保留字
static final byte offset_flag = 13; // 6位标志位
static final short offset_win = 14; // 16位窗口大小
static final short offset_crc = 16; // 16位校验和
static final short offset_urp = 18; // 16位紧急数据偏移量
public byte[] m_Data;
public int m_Offset;
public TCPHeader(byte[] data, int offset) {
this.m_Data = data;
this.m_Offset = offset;
}
public int getHeaderLength() {
int lenres = m_Data[m_Offset + offset_lenres] & 0xFF;
return (lenres >> 4) * 4;
}
public short getSourcePort() {
return ProxyUtils.readShort(m_Data, m_Offset + offset_src_port);
}
public void setSourcePort(short value) {
ProxyUtils.writeShort(m_Data, m_Offset + offset_src_port, value);
}
public short getDestinationPort() {
return ProxyUtils.readShort(m_Data, m_Offset + offset_dest_port);
}
public void setDestinationPort(short value) {
ProxyUtils.writeShort(m_Data, m_Offset + offset_dest_port, value);
}
public byte getFlags() {
return m_Data[m_Offset + offset_flag];
}
public short getCrc() {
return ProxyUtils.readShort(m_Data, m_Offset + offset_crc);
}
public void setCrc(short value) {
ProxyUtils.writeShort(m_Data, m_Offset + offset_crc, value);
}
public int getSeqID() {
return ProxyUtils.readInt(m_Data, m_Offset + offset_seq);
}
public int getAckID() {
return ProxyUtils.readInt(m_Data, m_Offset + offset_ack);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return String.format("%s%s%s%s%s%s%d->%d %s:%s",
(getFlags() & SYN) == SYN ? "SYN " : "",
(getFlags() & ACK) == ACK ? "ACK " : "",
(getFlags() & PSH) == PSH ? "PSH " : "",
(getFlags() & RST) == RST ? "RST " : "",
(getFlags() & FIN) == FIN ? "FIN " : "",
(getFlags() & URG) == URG ? "URG " : "",
getSourcePort() & 0xFFFF,
getDestinationPort() & 0xFFFF,
getSeqID(),
getAckID());
}
}