2

私はPcapを使用してネットワークtcpパッケージを構築しています:

    private static Packet BuildTcpPacket()
    {
        EthernetLayer ethernetLayer =
            new EthernetLayer
            {
                Source = new MacAddress("01:01:01:01:01:01"),
                Destination = new MacAddress("02:02:02:02:02:02"),
                EtherType = EthernetType.None, // Will be filled automatically.
            };

        IpV4Layer ipV4Layer =
            new IpV4Layer
            {
                Source = new IpV4Address("1.2.3.4"),
                CurrentDestination = new IpV4Address("11.22.33.44"),
                Fragmentation = IpV4Fragmentation.None,
                HeaderChecksum = null, // Will be filled automatically.
                Identification = 123,
                Options = IpV4Options.None,
                Protocol = null, // Will be filled automatically.
                Ttl = 100,
                TypeOfService = 0,
            };

        TcpLayer tcpLayer =
            new TcpLayer
            {
                SourcePort = 4050,
                DestinationPort = 25,
                Checksum = null, // Will be filled automatically.
                SequenceNumber = 100,
                AcknowledgmentNumber = 50,
                ControlBits = TcpControlBits.Acknowledgment,
                Window = 100,
                UrgentPointer = 0,
                Options = TcpOptions.None,
            };

        PayloadLayer payloadLayer =
            new PayloadLayer
            {
                Data = new Datagram(Encoding.ASCII.GetBytes("hello world")),
            };

        PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, tcpLayer, payloadLayer);

        return builder.Build(DateTime.Now);
    }

パッケージはイーサネット経由で送信されるため、パッケージの最大合計サイズは1500バイトに制限されています。実際のデータ用にどれだけのスペースが残っているかを知るために、パッケージヘッダーのサイズを確認するために使用できる方法はありますか?

また、1500バイトを超えるデータを送信する必要がある場合、それを分割するだけですか、それとも他のルールを遵守する必要がありますか?

4

1 に答える 1

2

はい。

ILayer.Lengthプロパティを使用して、各レイヤーの長さを取得できます。

IPフラグメンテーションを使用するか、通常のTCP(ほとんどのアプリケーションが行うこと)を使用してパケットを分割できます。

于 2012-10-21T22:38:44.990 に答える