def read_tcp(self, length):
        """Read Transmission Control Protocol (TCP).

        Structure of TCP header [RFC 793]:

             0                   1                   2                   3
             0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |          Source Port          |       Destination Port        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                        Sequence Number                        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                   Acknowledgement Number                      |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |  Data |           |U|A|P|R|S|F|                               |
            | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
            |       |           |G|K|H|T|N|N|                               |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |           Checksum            |         Urgent Pointer        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                    Options                    |    Padding    |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                             data                              |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


            Octets      Bits        Name                    Description
              0           0     tcp.srcport             Source Port
              2          16     tcp.dstport             Destination Port
              4          32     tcp.seq                 Sequence Number
              8          64     tcp.ack                 Acknowledgement Number (if ACK set)
              12         96     tcp.hdr_len             Data Offset
              12        100     -                       Reserved (must be zero)
              12        103     tcp.flags.ns            ECN Concealment Protection (NS)
              13        104     tcp.flags.cwr           Congestion Window Reduced (CWR)
              13        105     tcp.flags.ece           ECN-Echo (ECE)
              13        106     tcp.flags.urg           Urgent (URG)
              13        107     tcp.flags.ack           Acknowledgement (ACK)
              13        108     tcp.flags.psh           Push Function (PSH)
              13        109     tcp.flags.rst           Reset Connection (RST)
              13        110     tcp.flags.syn           Synchronize Sequence Numbers (SYN)
              13        111     tcp.flags.fin           Last Packet from Sender (FIN)
              14        112     tcp.window_size         Size of Receive Window
              16        128     tcp.checksum            Checksum
              18        144     tcp.urgent_pointer      Urgent Pointer (if URG set)
              20        160     tcp.opt                 TCP Options (if data offset > 5)

        """
        if length is None:
            length = len(self)

        _srcp = self._read_unpack(2)
        _dstp = self._read_unpack(2)
        _seqn = self._read_unpack(4)
        _ackn = self._read_unpack(4)
        _lenf = self._read_binary(1)
        _flag = self._read_binary(1)
        _wins = self._read_unpack(2)
        _csum = self._read_fileng(2)
        _urgp = self._read_unpack(2)

        tcp = dict(
            srcport=_srcp,
            dstport=_dstp,
            seq=_seqn,
            ack=_ackn,
            hdr_len=int(_lenf[:4], base=2) * 4,
            flags=dict(
                ns=True if int(_lenf[7]) else False,
                cwr=True if int(_flag[0]) else False,
                ece=True if int(_flag[1]) else False,
                urg=True if int(_flag[2]) else False,
                ack=True if int(_flag[3]) else False,
                psh=True if int(_flag[4]) else False,
                rst=True if int(_flag[5]) else False,
                syn=True if int(_flag[6]) else False,
                fin=True if int(_flag[7]) else False,
            ),
            window_size=_wins,
            checksum=_csum,
            urgent_pointer=_urgp,
        )

        # packet type flags
        self._syn = True if int(_flag[6]) else False
        self._ack = True if int(_flag[3]) else False

        _hlen = tcp['hdr_len']
        _optl = _hlen - 20
        if _optl:
            options = self._read_tcp_options(_optl)
            tcp['opt'] = options[0]     # tuple of option acronyms
            tcp.update(options[1])      # merge option info to buffer

        length -= _hlen
        tcp['packet'] = self._read_packet(header=_hlen, payload=length)

        return self._decode_next_layer(tcp, None, length)
Read Transmission Control Protocol (TCP).

        Structure of TCP header [RFC 793]:

             0                   1                   2                   3
             0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |          Source Port          |       Destination Port        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                        Sequence Number                        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                   Acknowledgement Number                      |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |  Data |           |U|A|P|R|S|F|                               |
            | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
            |       |           |G|K|H|T|N|N|                               |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |           Checksum            |         Urgent Pointer        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                    Options                    |    Padding    |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                             data                              |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


            Octets      Bits        Name                    Description
              0           0     tcp.srcport             Source Port
              2          16     tcp.dstport             Destination Port
              4          32     tcp.seq                 Sequence Number
              8          64     tcp.ack                 Acknowledgement Number (if ACK set)
              12         96     tcp.hdr_len             Data Offset
              12        100     -                       Reserved (must be zero)
              12        103     tcp.flags.ns            ECN Concealment Protection (NS)
              13        104     tcp.flags.cwr           Congestion Window Reduced (CWR)
              13        105     tcp.flags.ece           ECN-Echo (ECE)
              13        106     tcp.flags.urg           Urgent (URG)
              13        107     tcp.flags.ack           Acknowledgement (ACK)
              13        108     tcp.flags.psh           Push Function (PSH)
              13        109     tcp.flags.rst           Reset Connection (RST)
              13        110     tcp.flags.syn           Synchronize Sequence Numbers (SYN)
              13        111     tcp.flags.fin           Last Packet from Sender (FIN)
              14        112     tcp.window_size         Size of Receive Window
              16        128     tcp.checksum            Checksum
              18        144     tcp.urgent_pointer      Urgent Pointer (if URG set)
              20        160     tcp.opt                 TCP Options (if data offset > 5)