zoukankan      html  css  js  c++  java
  • TCP数据包格式

    TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结构比前面的结构都要复杂.

    行 0.......4.......8..10...........16..............24..............32
     ------------------------------------------------------------------
    1|.........源端口.src-port.......|.........目的端口.dst-port.....|
     ------------------------------------------------------------------
    2|............................序列号.seq.........................|
     ------------------------------------------------------------------
    3|............................确认号.ack_seq.....................|
     ------------------------------------------------------------------
     |........|..........|U|A|P|R|S|F|...............................|
    4|首部长度|.保留(6)..|R|C|S|S|Y|I|.......窗口.window.............|
     |..doff..|..........|G|K|H|T|N|N|...............................|
     ------------------------------------------------------------------
    5|........校验和.check...........|........紧急指针.urg_ptr.......|
     ------------------------------------------------------------------
     |.......................选项....................|....填充字节...|
     ------------------------------------------------------------------

    每行32位=4字节。

    Source Port (16) | Destination Port (16)
    Sequence Number (32)
    Acknowledgment Number (32)
    Data Offset(4) | Reserved (6)|UGR|ACK|PSH|RST|SYN|FIN|Window(16)
    Checksum (16) | Urgent Pointer (16)
    Options (0 or more 32 bit words + padding)
    DATA

      

         TCP各字段的含义

    Source Port & Destination Port
    如果我们将IP比喻成地址那麽Port可以说是门口了试想一下一座大楼有前门後门侧门送货的门出货的门倒垃圾的门扔死尸的门等等乱七八糟的门...... 那麽一个IP地址也有着好多个各种功能的port而每一个port都被不同的服务倾听着就好比看门人一样。下面是一些常用port和其对应的服务有兴趣的 朋友可以在Linux的/etc/services这个档案找到它们
    ftp-data 20/tcp
    ftp 21/tcp
    telnet 23/tcp
    smtp 25/tcp mail
    www 80/tcp http # WorldWideWeb HTTP
    www 80/udp # HyperText Transfer Protocol
    pop-3 110/tcp # POP version 3
    pop-3 110/udp


    其实port号码可以随您喜欢任意指定给哪些服务使用但为了避免“找错门口”的情形出现(除非您故意想躲起来)人们将一些比较常用的服务(Well known services)的port号码固定下来了。但是在TCP资料传送过程中可能同时要处理一个以上的封包程式也会建立多个port来避免突。在两台主机进 行资料传送的时候来源地的port和目的地的port都必须让TCP知道才行。

    Sequence Number
    发送序号。当资料要从一台主机传送去另一台主机的时候发送端会为封包建立起一个初始号码然後按照所传送的位元组数依次的递增上去那麽下一个封包的序号就会使用递增之後的值来作为它的序号了。这样接收端就可以根据序号来检测资料是否接收完整了。


    Acknowledgement Number
    回应序号。当接收端接收到TCP封包之後通过检验确认之後然後会依照发送序号产生一个回应序号发出一个回应封包给发送端这样接收端就知道刚才的封包已经被成功接收到了。

    可是如果由於网路状况或其它原因当封包的TTL值达到期限时接收端还没接收到回应序号就会重发该个被以为丢失了的封包。但如果刚好重发封包之後才接收到回应呢这时候接收端就会根据序号来判断该封包是否被重发送如果是的话很简单将之丢弃不做任何处理就是了。

    Data Offset
    这是用来记录标头固定长度用的,和IP封包的IHL差不多。如果options没设定的话,其长度就是20byte,用十六进位表示就是 0x14了。

    Reserved
    这是保留区间暂时还没被使用。

    Contral Flag
    控制标记。一共有六个它们分别是:
    Urgent data
    如果URG为1,表示这是一个携有紧急资料的封包。

    Acknowledgment field significant
    如果ACK为1,表示此封包属于一个要回应的封包。一般都会为1。

    Push function
    如果PSH为1,此封包所携带的数据会直接上传给上层应用程序而无需经过TCP处理。

    Reset
    如果RST为1,要求重传。表示要求重新设定封包再重新传递。

    Synchronize sequence number
    如果SYN为1,表示要求双方进行同步沟通。

    No more data for sender (Finish)
    如果FIN为1,表示传送结束,然後双方发出结束回应进而正式终止一个TCP传送过程。
    Window
    我们都知道MS Windows是什么东西,但这里的Window却非操作系统的“视窗”哦,这里一般称为“滑动视窗(Sliding Window)”。为什么我们需要使用视窗呢?

    正如您刚才看到的TCP封包会通过SQN和ACK序号来确保传送的正确性,但如果每一个封包都要等上一个封包的回应才被发送出去的话实在是太慢和难以接受 的。这样我们可以利用Sliding Window在传送两端划分出一个范围,规定出可以一次性发送的最大封包数目。

    当TCP传送建立起来之後两端都会将window的设定值还原到初始值比方说每次传送3个封包。然后发送端就一次发送三个封包出去,然后视窗则会往後移动 三个封包填补发送出去之封包的空缺。如果接收端够顺利也能一次处理接收下来的三个封包的话,就会告诉发送端的window值为3,但如果接收端太忙或是其 它因素影响暂时只能处理两个封包,那么在视窗里面就剩下一个封包,然后就会告诉发送端window值为2。这个时候发送端就只送出两个封包而视窗就会往後 移动两个封包填补发送出去的空缺。您明白为什麽这个视窗会“滑动”了吧。

    其实,Window值是以字节数计算的。

    Chechsum
    当资料要传送出去的时候发送端会计算好封包资料大小然後得出这个检验值封包一起发送当接收端收到封包之後会再对资料大小进行计算看看是否和检验值一致如果结果不相称则被视为残缺封包会要求对方重发该个封包。

    Urgent Pointer
    还记得刚才讲到Control Flag的时候我们提到一个URG的标记吗如果URG被设定为一的时候这里就会指示出紧急资料所在位置。不过这种情形非常少见例如当资料流量超出频宽的时 候系统要求网路主机暂缓发送资料所有主机收到这样的信息都需要优先处理。

    Option
    这个选项也比较少用。当那些需要使用同步动作的程式如Telnet要处理好终端的交互模式就会使用到option来指定资料封包的大小因为telnet使用的资料封包都很少但又需要即时回应。

    Option的长度为0,或32bit的整倍数,如果不足则填充到满。

    下面我们撷取一个TCP封包看看您能从其中解读出什麽意思

    UDP还是TCP

    在TCP/IP的网路IP封包会透过ICMP协定来检测对方的存在而确保最大可能性的正确传送。不过在传送层里面除了TCP这个协定之外我们还使用另一个 传输协定就是UDP (User Datagram Protocol)他和TCP最大的分别是不侦测对方的存在就直接将资料送给对方而假设对方会自行接收。

    这样对那些需要大楼资料存取而又不要求可靠传输的程式如声音传递可以省却双方的沟通和确认时间从而提高资料传输量。使用UDP的程式协定例如有DNSSNMPNFSBOOTP等等。


    协定 优点 缺点
    TCP 传送稳定资料传送成功率高。 速度比较慢。
    UDP 传输量大迅速。 不稳定容易遗失资料。



    TCP的结构在中定义为:.
    struct tcphdr {
    u_int16_t source;
    u_int16_t dest;
    u_int32_t seq;
    u_int32_t ack_seq;
    #if __BYTE_ORDER == __LITTLE_ENDIAN
    u_int16_t res1:4;
    u_int16_t doff:4;
    u_int16_t fin:1;
    u_int16_t syn:1;
    u_int16_t rst:1;
    u_int16_t psh:1;
    u_int16_t ack:1;
    u_int16_t urg:1;
    u_int16_t res2:2;
    #elif __BYTE_ORDER == __BIG_ENDIAN
    u_int16_t doff:4;
    u_int16_t res1:4;
    u_int16_t res2:2;
    u_int16_t urg:1;
    u_int16_t ack:1;
    u_int16_t psh:1;
    u_int16_t rst:1;
    u_int16_t syn:1;
    u_int16_t fin:1;
    #endif
    u_int16_t window;
    u_int16_t check;
    u_int16_t urg_prt;
    };

    source发送TCP数据的源端口
    dest接受TCP数据的目的端口

    seq标识该TCP所包含的数据字节的开始序列号,正常情况下,每次的seq为上次的seq加上上次发送的数据字节数(数据字节数=IP包总长-IP头长-TCP头长)。

    ack_seq确认序列号,表示接受方下一次接受的数据序列号。以最后接收的seq+接收的数据字节数。

    doff数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5

    urg如果设置紧急数据指针,则该位为1

    ack如果确认号正确,那么为1

    psh如果设置为1,那么接收方收到数据后,立即交给上一层程序

    rst为1的时候,表示请求重新连接

    syn为1的时候,表示请求建立连接

    fin为1的时候,表示亲戚关闭连接

    window窗口,告诉接收者可以接收的大小(字节数)

    check对TCP数据进行较核

    urg_ptr如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值

    关于TCP协议的详细情况,请查看 RFC793


    7.6 TCP连接的建立
    TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这个连接过程称为"三次握手".

    下面我们从一个实例来分析建立连接的过程.

    第一步客户机向服务器发送一个TCP数据包,表示请求建立连接. 为此,客户端将数据包的SYN位设置为1,并且设置序列号seq=1000(我们假设为1000).

    第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务 器设置ACK为1,ack_seq=1001(对方的序列号1000+1)同时设置自己的序列号.seq=2000(我们假设为2000).

    第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息.客户机设 置ACK=1,和ack_seq=2001(对方的序列号2000+1),seq=1001,发送给服务器.至此客户端完成连接.

    最后一步服务器受到确认信息,也完成连接.

    通过上面几个步骤,一个TCP连接就建立了.当然在建立过程中可能出现错误,不过TCP协议可以保证自己去处理错误的.


    说一说其中的一种错误.
    听说过DOS吗?(可不是操作系统啊).今年春节的时候,美国的五大网站一起受到攻击.攻击者用的就是DOS(拒绝式服务)方式.概括的说一下原理.
    客户机先进行第一个步骤.服务器收到后,进行第二个步骤.按照正常的TCP连接,客户机应该进行第三个步骤.
    不过攻击者实际上并不进行第三个步骤.因为客户端在进行第一个步骤的时候,修改了自己的IP地址,就是说将一个实际上不存在的IP填充在自己IP数据包的 发送者的IP一栏.这样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号,这样服务务端会在那边一直等待,直到超时.
    这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光,而不能再接收客户机的请求.
    这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功.于是就出现了春节时所出现的情况.


    http://oa.jmu.edu.cn/netoa/libq/pubdisc.nsf/aac7d56ca8fd884b852563be00610639/c2baaff26ce2e72948257288004e6459?OpenDocument&ExpandSection=1

  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/myphoebe/p/2131980.html
Copyright © 2011-2022 走看看