10:08:51.006836 IP 58.16.246.110.25479 > 58.16.246.220.5016: P 33025:33041(16) ack 33228 win 5840
        0x0000:  4500 0038 d14f 4000 4006 0805 3a10 f66e  E..8.O@.@...:..n
        0x0010:  3a10 f6dc 6387 1398 2e78 1088 5a1a ac28  :...c....x..Z..(
        0x0020:  5018 16d0 6196 0000 0000 000c 8000 0015  P...a...........
        0x0030:  0000 0000 a716 f4f8                      ........

IP Header
45
   4           //协议版本 ipv4    4bit
   5           //IHL位 20字节, 表示IP Header长度 以32bit为除数计算出的IP头部长度   本区域值 = IP头部长度 / 32 最长的IP包头长度可以为480bit
00             // 服务类型 Type of Service
      Precedence和TOS。定义IP协议包的处理方法,它包含如下子字段
        过程字段(优先权):3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
        延迟(时延)字段:1位,取值:0(正常)、1(期特低的延迟)
        流量(吞吐量)字段:1位,取值:0(正常)、1(期特高的流量)
        可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
        成本(开销)字段:1位,取值:0(正常)、1(期特最小成本)
        未使用(保留位):1位,恒设为0
      TOS目前不太使用。而Precedence则用于QOS应用。(TOS字段的详细描述RFC 1340 1349)
00 38          //IP数据报文总长
d1 4f          //标识符(Identifier):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对大的上层数据包进行分段(fragment)操作。如果数据包原始长度超过MTU,那么将他分段为更小的数据包.然后路由器在每片数据包的标志字段打上相同的标记,以便接收设备可以识别出属于一个数据包的分段.分段的数据包不会在数据链路的另外一端重新组合,直到最终目的地才会重组.
40 00         //标记(Flags):长度3比特  分段序号(Fragment Offset):长度13比特
40            //TTL
06            //协议(Protocol):长度8比特。标识了上层所使用的协议。TCP=06 UDP=17 ICMP=01 其他请查看cat /etc/protocols
08 05         //头部校验(Header Checksum):长度16位,由于IP包头是变长的,所以提供一个头部校验来保证IP包头中信息的正确性。
3a 10 f6 6e 3a 10 f6 dc

tcp Header
6387            //src port  本地端口25479
1398            //dest port 目标端口5016
2e78 1088       //Sequence Number 顺序号
5a1a ac28       //ack num 确认号
5018            //tcp头长度 20字节   5018  2进制01010000 00011000
    5 0101      //表示tcp长度 20字节
    0000 00     //保留 无意义
    011000      //6bit 标志位

      URG: (Urgent Pointer field significant)紧急指针。用到的时候值为1,用来处理避免TCP数据流中断
      ACK: (Acknowledgment fieldsignificant)置1时表示确认号(AcknowledgmentNumber)为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。 
      PSH: (Push Function),PUSH标志的数据,置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。 
      RST: (Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误。 
      SYN: (Synchronize sequence numbers)用来建立连接,在连接请求中,SYN=1,ACK=0,连接响应时,SYN=1,ACK=1。即,SYN和ACK来区分 Connection Request和Connection Accepted。 
      FIN: (No more data from sender)用来释放连接,表明发送方已经没有数据发送了。 

16d0 6196 0000

data
0000 000c 8000 0015 0000 0000 a716 f4f8   //承载的数据体



3.5.1 概述
Transmission Control Protocol传输控制协议( TCP )是面向连接的传输层协议,能提供全双工的,可靠的数据传输。为TCP/IP协议栈的一部分。
所谓面向连接,即当连接时,需创建一个虚拟电路。并且它所传输字节是编号的,丢失或损坏的数据是会被请求再次传送。完整的传送数据的完整性,是通过校验和来确保。
当前大部分的应用层协议都使用TCP,如FTP,HTTP,TELNET等。
TCP连接需要指定的两端(来源和目的地)的端口号。 这个数字是2字节,所以它值介于065535 。关于TCP的端口号可查看[url]http://www.iana.org/assignments/port-numbers[/url]

3.5.2 TCP数据包的格式

TCP数据包的格式
如下图,使用Wireshark捕获到的一个TCP数据包的内容
Source port(源端口号):一个2字节的字段,源设备的端口号。
Destination port(目的端口号):一个2字节的字段,目的设备的端口号。
Sequence number(序列号):一个4字节的字段,用于保证到达的数据正确顺序的数字。
Next sequence number(下个序列号):一个可变字节的字段,当前已收到的字节数。
Acknowledgement number(确认号):一个4字节的字段,期待传输的下一个TCP字节的编号。
Header length(报头长度):一个1字节的字段,报头的字数。
Flags(标记):一个1字节的字段,有控制功能的标记,具体见表3-4
     3-4Flag的字段
字段
描述
Congestion Window ReducedCWR)拥塞窗口减少
由发送主机设置,以表明它收到带ECE标记设置的TCP数据包。
ECN-Echo
表明了TCP 的对等体在3次握手过程中,是明确拥塞通知能力的,即允许端到端的通知挤塞,并不丢弃的数据包。
Urgent(紧急)
被用于发送的数据,要立即被处理,无需等待接收设备缓存中的数据完成。
Acknowledgment(确认)
确认从主机之间收到TCP数据
Push
表示数据包中的数据必须迅速传播到上层协议处理。
Reset(重置)
由于不可能恢复的错误,造成TCP连接重置. 当被接收TCP 段的RST, 接收方必须终止连接。导致双方立刻重新设置连接和发布它的资源。结果可能导致数据在传送中被丢失。RST 不为正常关闭TCP 连接方式; 它表明一个异常条件。通常关闭TCP 连接, 使用FIN标志。重新设置的原因可能是主机崩溃或被延迟的重复SYN 包。
Syn(同步)
打开主机之间的虚拟电路的连接
Fin(完成)
用主机来结束TCP连接,不再需要数据传输。
 
Windows size(窗口尺寸):一个2字节的字段,发送设备希望接收的字节数。
Checksum(校验和):一个2字节的字段,根据报头和数据字段计算出的校验和。
Data(数据):一个可变字节的字段,上层协议的数据。
TCP鏁版嵁鍖?


本文出自 “易安君的UFO” 博客,请务必保留此出处http://424546.blog.51cto.com/414546/91044