質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
IPv6

IPv6は、インターネットプロトコルの一つ。主流となっているIPv4に変わるものとして設計されました。IPアドレスの需要の増大を予見して開発されたもので、従来よりも多くのIPアドレスの作成が可能です。

IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

2回答

1816閲覧

TCPパケットを見るだけで、正しい宛先が指定されているIPヘッダーを付与することは出来るのか?

hu476

総合スコア4

IPv6

IPv6は、インターネットプロトコルの一つ。主流となっているIPv4に変わるものとして設計されました。IPアドレスの需要の増大を予見して開発されたもので、従来よりも多くのIPアドレスの作成が可能です。

IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

0クリップ

投稿2020/04/12 03:48

質問

何かしらのアプリケーションプロトコルがデータ部分に入っていてTCPヘッダが付与されたTCPパケットがあるとします。
このTCPパケットを見ただけで、正しいIPヘッダーを付与しIPパケットを生成する事は可能なのでしょうか?

背景

HTTPプロキシ、SOCKSプロキシ、VPNの仕組みを調べている祭、不随して通信のヘッダー付与の仕組みが気になり調べていました。
ざっくりですがアプリケーションが通信をする祭は、例えばアプリがHTTPだった場合

1、アプリ層で何かしらのデータに対してHTTPヘッダが付与される

2、トランスポート層でHTTPパケットに対してTCPヘッダが付与される

3、インターネット層でTCPパケットに対してIPヘッダが付与される

という流れで情報が付与されていくと思います。

この時、2を行う際はHTTPヘッダー内にポート番号が存在しているので
TCPヘッダーを作る時HTTPパケットを見るだけで、「あぁこのポートにつないでほしいHTTPパケット君なんだな」と分かり
アプリ層が意図した宛先のTCPヘッダー(宛先ポート番号等)を付与することが出来ると思います。(違ったらご教示頂けると助かります・・・)

しかしHTTPパケットがデータとしてカプセル化されているTCPヘッダーの中身を見るとIPアドレス(またはそれに一意に対応するホスト名)が入っていません。
(参考)TCPヘッダーの内容

この状態で3を行う際にIPヘッダーを付与を担当するプログラムは、いったいどうやって降ってきたTCPパケットが意図する宛先IPアドレスを
IPヘッダーに付与しているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

2を行う際はHTTPヘッダー内にポート番号が存在しているので

Hostヘッダのことであれば、これはHTTP/1.1で登場した機能で、HTTP/1.0では存在していません。
HTTPサーバーがバーチャルホスト機能を使っている場合に同一IPアドレスのどのホストへのリクエストかを判断するための物で、通信のための物では無いです。

この状態で3を行う際にIPヘッダーを付与を担当するプログラムは、いったいどうやって降ってきたTCPパケットが意図する宛先IPアドレスをIPヘッダーに付与しているのでしょうか?

TCP層のプロトコルスタックは、TCPパケットと共に、IPアドレス情報をIP層のプロトコルスタックに渡します。

ある層のプロトコルスタックが上位層のヘッダを覗くことは原則としてないです。
(パフォーマンス向上のために見るのはあった気がします)

投稿2020/04/12 05:23

otn

総合スコア84498

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hu476

2020/04/12 09:03

ご回答ありがとうございます。 > TCP層のプロトコルスタックは、TCPパケットと共に、IPアドレス情報をIP層のプロトコルスタックに渡します。 もしかしてHTTP層のプロトコルスタックが、HTTPパケットとともにホスト名(IPアドレス情報)とポート番号をTCP層のプロトコルスタックに渡して、 TCP層のプロトコルスタックが、ホスト名(IPアドレス情報)をリレー的にIP層のプロトコルスタックに渡しているという事でしょうか? (私の「下位層のプログラムに渡すものはパケットのみ」という考え方がおかしかったという考え)
otn

2020/04/12 09:12

> もしかしてHTTP層のプロトコルスタックが、HTTPパケットとともにホスト名(IPアドレス情報)とポート番号をTCP層のプロトコルスタックに渡して、TCP層のプロトコルスタックが、ホスト名(IPアドレス情報)をリレー的にIP層のプロトコルスタックに渡しているという事でしょうか? そう書いたつもりです。 なお、HTTP層がTCP層、さらにTCP層がIP層に渡すのはIPアドレスであってホスト名ではありません。ホスト名は名前解決してIPアドレスに変換してからです。つまり、ブラウザがDNSを引きます。
hu476

2020/04/12 11:26

返信ありがとうございます。 ブラウザが先にDNSを引くのですね。 色々理解できて来た気がします。 アプリケーション層のアプリケーション(例えばchromeブラウザ)が、「このHTTPパケットをポート番号〇〇、宛先IP〇〇に対してTCP通信してほしいです」とトランスポート層のプロトコルスタックに渡す際に行われる命令はカーネルに対して行うシステムコールでしょうか?
otn

2020/04/12 11:54

システムコールはもう少し低レベルです。 socket() → connect() → write()(またはsend()) → close() connetの時にIPアドレスとポートを指定します。 TCPのプロトコルスタックは、システムコールのconnectとwriteとcloseの内部で呼ばれます。 C以外で書かれていれば、システムコールを直接呼ばず、言語のライブラリを使っているかも知れません。
guest

0

この状態で3を行う際にIPヘッダーを付与を担当するプログラムは、いったいどうやって降ってきたTCPパケットが意図する宛先IPアドレスを

IPヘッダーに付与しているのでしょうか?

IPレベルでの接続が確立していますので、宛先などの情報はそれに伴って振られます、「中身を見て」ではありません。

投稿2020/04/12 03:57

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hu476

2020/04/12 04:02

ご回答ありがとうございます。 >IPレベルでの接続が確立していますので ヘッダーを作成している最中は、まだ通信は始まっていないと思っているのですが・・・ 何かかみ合っていない気がしています。
maisumakun

2020/04/12 04:33

一部例外はありますが、上位層にとって下位層は「単なる通信手段」、下位層にとって上位層から来るものは「単なるデータ」であって、「HTTPの中身を見てTCPヘッダを作る」ということではありません。
maisumakun

2020/04/12 04:35

「IPはIPとして(IPアドレスを指定して)通信を開いておいて、そのIPでの通信にTCPデータを流す」という構造です。
hu476

2020/04/12 05:22

返信ありがとうございます。 上位層と下位層はやり取りを行わない?という返信を参考に考えを巡らせてみました。(各層のヘッダーはそれぞれ独立して作られているという考え) 以下の考えは正しいでしょうか? ##HTTP通信をブラウザがhoge.com:60000に対して行う時のIPパケットの出来上がり方## 1、ブラウザが何かしらのデータに対してHTTPヘッダーを付与する(HTTPパケット作成) 2、ブラウザが、ブラウザ操作者が指定したポート番号60000を認識し、OSに対してポート番号60000とHTTPパケットを渡す 3、OSが、もらったHTTPパケットに宛先60000ポート番号のTCPヘッダーを付与(TCPパケット作成) 4、ブラウザが、ブラウザ操作者が指定したホスト名hoge.comを認識し、OSに対して「さっき作ったTCPパケットに宛先hoge.comのIPヘッダーつけて」と命令 5、OSはhoge.comのDNS解決を行い、IPアドレスを獲得し、TCPパケットにIPヘッダーを付与(IPパケット作成) また、もし宜しければ >一部例外はありますが これの例があれば教えて頂きたく思います。 長文大変失礼しますが、ご回答いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問