私は組み込みデバイス上のLWIP TCP/IPスタックを使用しています、そして私はそれがどのように機能するかを理解しようとしています。私はドキュメントとコードを見ていましたが、私はポートとURIスキームがTCP/IPスタックによってどのように処理されるかによって混乱しています。
最初の混乱のことは、両方ともプロトコルを定義しているようです。これは冗長ですか?
LWIPの場合、TCP接続を設定するには、「プロトコル制御ブロック」(PCB)を作成します。これはローカルIPアドレスとポートによって定義されます。それは意味があるようです - このPCB指定されたポートを待機します。 URIスキームはどのようにしてこれにプレーしますか?これはPCB任意のURIスキームを受信しますか?また、パケットを受信するためのコールバック関数にURIスキームが渡されていないこともわかりません。
プロトコルを変更したい場合は、この作業はどのようにしていますか - HTTP接続をWebSocket接続にアップグレードしますか? Intial Handshakeがhttp:port 80を介して行われた場合、その他の通信はWSを介して行われますか?
例として、ここでは、LWIP(Cコード内の)PCB = = in <[PCB]> =の関数署名です。
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
これにより、PCB =にIPアドレスとポート番号にバインドします。ただし、URIスキームは指定されていません。したがって、PCBがURIスキームにAgnosticであると仮定する。パケットを受信するためのコールバックプロトタイプを見れば:
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)
繰り返しますが、URIスキームは表示されません。 LWIPを使用してHTTPサーバーを実装するためのソースコードもあります。どこにもないのは、URIスキームが表示されます。そのため、IPスタックによってどのように処理されたさまざまなURIスキームはどうですか? IPトラフィックを処理するためのコールバックに引数として渡される場所が見つかりません。私は基本的なものが足りないと思います。
どんな助けにかかっています!
TCPは、インターネットのようなIPネットワーク内の2つのエンドポイント間の信頼性の高いデータ配信のための一般的なストリームプロトコルです。
HTTPはTCPの上で実行されるプロトコルです。 TCPを使用するその他のプロトコルはFTP、SSH、SSLなどです。
説明した機能は、一般的にTCP接続を処理するためのものです。
あなたは読むべきです http://www.w3.org/protocols/rfc2616/rfc2616.html HTTPプロトコルを学ぶべきです。
HTTPリクエストがどのように行われるかを概説します。この例は、より簡単なので、HTTP 1.0に基づいています。
ブラウザに接続するために http://superuser.com に指示すると、これはバックグラウンドで起こることです。
superuser.com
のDNSルックアップを行います。superuser.com
のサーバーへの接続を開きます。GET /
HTTP要求をサーバーに送信します。/
locationに対応するファイルを返送します。そのため、サーバーはここでURIスキームについて何も知る必要はありません。サーバーはHTTPプロトコルプリミティブ(GET、POST、HEADなどを理解し、TCPソケットを介してクライアントに対応するリソースを返す必要があります。