PTP (Precision Time Protocol) は、分散システムでサブマイクロ秒レベルの時刻同期を実現できる時刻同期プロトコルです。産業オートメーションやネットワーク通信などの分野では、時刻同期が非常に重要です。 PTP プロトコルの実装は常にホットなトピックであり、Golang は効率的なプログラミング言語であり、その自然な同時実行特性と優れたメモリ管理メカニズムにより、PTP プロトコルの実装に推奨される言語の 1 つとなっています。
PTP プロトコルは IEEE 標準 1588 によって策定され、主に分散システム内のネットワーク ノード間の時刻同期を実現するネットワーク通信に使用されます。 PTP プロトコルは、ネットワークを介して基準クロックとスレーブ クロックの間で高精度の時刻情報を正確に同期するため、基準クロックとスレーブ クロックは基本的に一致します。
PTP プロトコルは主に、マスター クロックとスレーブ クロックの 2 つの役割で構成されます。マスター クロックはネットワークを通じて同期メッセージをブロードキャストし、スレーブ クロックはマスター クロックの同期メッセージを受け取り、遅延要求メッセージに基づいてマスター クロックとの遅延を計算し、フォローアップ メッセージを通じてクロックと時刻の校正を実行します。
Golang の利点は、正しい同時実行コードを非常に簡単に記述できることです。同時に、Golang のメモリ管理メカニズムもまた、開発者がメモリ リークなどの問題を解決するのに役立ちます。これらの機能は、PTP プロトコルの実装に非常に有益です。
2.1 PTP プロトコルの構造
PTP プロトコルは主にメッセージとパケットの 2 つの部分で構成されているため、Golang で構造を定義することでそれらを表現できます。
PTP プロトコルのメッセージの場合、次の定義方法を使用できます:
type Header struct{
TransportSpecific uint8 Version uint8 MessageLength uint16 DomainNumber uint8 Flags PTPFlags CorrectionField int64 SourcePortIdentity PortIdentity SequenceID uint16 ControlField uint8 LogMessageInterval uint8
}
PTP のレポートの場合プロトコル テキストでは、次の定義を使用できます:
type SyncMessage struct{
Header Header OriginTimestamp uint64
}
これは、ヘッダー構造と OriginTimestamp を含む同期メッセージの定義です。分野。他のメッセージも同様に定義できます。
2.2 PTP プロトコルの分析と生成
PTP プロトコルを実装するプロセスでは、ネットワーク データを解析して生成する必要があります。したがって、Golang のバイナリ パッケージを使用してネットワーク バイト オーダーを解析して生成する必要があります。
同期メッセージを例として、同期メッセージのネットワーク バイト オーダーを解析する ParseSyncMessage 関数を定義できます。
func ParseSyncMessage(data []byte) (*SyncMessage, error) {
msg := new(SyncMessage) err := binary.Read(bytes.NewReader(data), binary.BigEndian, &msg.Header) if err != nil { return nil, err } err = binary.Read(bytes.NewReader(data[40:48]), binary.BigEndian, &msg.OriginTimestamp) if err != nil { return nil, err } return msg, nil
}
この関数は、ネットワーク データから Header フィールドと OriginTimestamp フィールドを読み取り、値を返します。 SyncMessage 型の構造体。他のメッセージの解析関数も同様に実装できます。
PTP プロトコル メッセージを生成するには、Sync メッセージを生成する関数 GenerateSyncMessage を定義できます。この関数は、同期メッセージの各フィールドを対応する値に設定し、最終的にネットワーク バイト オーダーで同期メッセージを生成します。
func GenerateSyncMessage() ([]byte, error) {
msg := new(SyncMessage) msg.Header.TransportSpecific = 0x80 msg.Header.Version = 2 msg.Header.MessageLength = 44 msg.Header.DomainNumber = 0 msg.Header.ControlField = 0x00 msg.Header.SequenceID = 1 msg.Header.SourcePortIdentity = PortIdentity{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xff, 0xfe} msg.Header.Flags = PTPFlag(0x00) msg.Header.CorrectionField = 0 msg.OriginTimestamp = uint64(time.Now().UnixNano()) b := new(bytes.Buffer) err := binary.Write(b, binary.BigEndian, &msg) if err != nil { return nil, err } return b.Bytes(), nil
}
2.3 PTP プロトコルのネットワーク通信
PTP プロトコルは主に、クロック同期のためのネットワーク同期メッセージ。したがって、ネットワーク通信を実装するには、Golang の net パッケージを使用する必要があります。
以下は、Sync メッセージをネットワークにブロードキャストする実装方法です:
func BroadCastSyncMessage() error {
conn, err := net.ListenPacket("udp4", ":319") if err != nil { return err } defer conn.Close() for { b, err := GenerateSyncMessage() if err != nil { return err } _, err = conn.WriteTo(b, &net.UDPAddr{IP: net.IPv4(224, 0, 1, 129), Port: 319}) if err != nil { return err } time.Sleep(time.Second) } return nil
}
この関数は常にブロードキャストします。ネットワークへの同期メッセージは 1 秒に 1 回ブロードキャストされます。他のメッセージの送信メソッドも同様に実装できます。
この記事では、Golang を使用して PTP プロトコルを実装する方法を紹介します。構造の定義、ネットワーク データの分析と生成、およびネットワーク通信を通じて、PTP プロトコルを簡単に実装し、ネットワーク ノード間の時刻同期を実現できます。 Golang の自然な同時実行特性と優れたメモリ管理メカニズムにより、PTP プロトコルの実装が容易になります。
以上がgolang は ptp プロトコルを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。