、TCPスティックパッケージ、図示開梱
以下の4例があるかもしれませんように、バイト数を読む時間が不確実であるため、サーバー、クライアントがサーバに二つのパケットD1およびD2を送信すると仮定します。
1)は、2つの別個のデータパケット、それぞれD1およびD2は、サーバ2回読み出され、開梱パッケージスティックされていません
2)サーバは、2つのパケットを受信し、D1及びD2は、互いに結合と呼ばれる TCPスティックパッケージ
3)サーバは、パッケージの完全読出しパケットD1及びD2部分は、呼ばれ、残りのパッケージの内容D2第2読み出し、パケット、初めて2回読み出される TCPが開梱
D1、パッケージの内容D1 D1_2 D2及び完全なパッケージの残りの部分への第2の読み出し - 4)サーバは、最初の読み出し部は、パッケージD1_1に、パケット2回読み出されます。
受け入れられたTCPスライディングウィンドウは非常に小さく、データパケットD1とD2が比較的大きい場合、特に、なお、第五のケースを発生する可能性がある、D1及びD2パッケージにサービスエンドポイントを数回完全間、受け付け多くの場面で開梱。
第二に、スティックのパッケージは、理由が開梱発生しました
原因スライディングウィンドウ、MSS / MTUの制限、Nagleアルゴリズム:3つのタイプがあります。
1、スライディングウィンドウ
TCPフロー制御、主に使用してスライディングウィンドウプロトコルを、受容窓のサイズは、データ端末のスライディングウィンドウは、使用される流量を達成するように、送信側の受信側は、送信データのサイズを制御するために送信側に伝えるために使用されるバッファのサイズ
制御目的。ウィンドウサイズは、私たちの最初のいくつかのデータ伝送です。順次送信中のすべてのデータの送信側のためのフレーム番号が与えられ、常にのみフレームを送信する許可送信ウィンドウ内に入る、透過窓を維持します。
受信機は受信ウィンドウを維持しながら、唯一のフレームのみを受信するように許可された受信ウィンドウ内に入ります。したがって:透過窓のサイズと受信機のサイドウィンドウを調整することにより、フロー制御を達成することができます。
今、スライディングウィンドウを作成する方法を見ては、開梱、パッケージを固執されますか?
パッケージスティック:データ処理は、データの256バイトSO_RCVBUF(受信バッファ領域)にキャッシュされるので、各々が完全メッセージを表し、送信者256バイトを仮定し、受信者は間に合いません。
キャッシュ内のパケット数のSO_RCVBUF受信者ならば、関係する受信者のために、これはスティックパッケージです。
開梱:受信機のみ窓128とし、他の場合を考えると、送信側はまた、128バイトの最大値を送ることができることを意味し、
送信側とデータサイズが256バイトであり、したがって、128バイトの残りのバイトを送信するために、ACKの後まで、受信機を送信する前に以来。これは、開梱をもたらしました。
2、MSS及びMTUフラグメンテーション
MSSは:最大Segementサイズは略語で、TCPは、パケットのデータ部分の最大長さを表し、TCPプロトコルは、OSIネットワークモデルには5つである最大データ転送が一次層に送信することができる制限します。
MTU:最大伝送単位Maxitum伝送ユニットは、5層のOSIネットワークモデルの略語である最大データリンク層(データリンク層)は、一次に送信することができる制限します。
送信すべきデータがMSSまたはMTUよりも大きい場合、データは、送信のために複数のパケットに分割されます。MSSは、MTUから計算されるので、これデータ伝送はMSS、必ずしも満足MTUを満たすために場合。
よりよく理解するために、我々は最初のTCP五層ネットワークモデルを介してデータを送信するためにアプリケーション・プロセスを紹介します:
アプリケーション層のために、送信データDATAとだけ関係する、データを送信SO_SNDBUFを取り出すするオペレーティング・システムにデータを返すために、カーネル内の送信バッファSO_SNDBUFソケット、すなわち、に書き込まれます。
DATA-輸送層の前に完全なTCPパケットを構成する、TCPヘッダを追加します。
データはネットワーク層(ネットワーク層)に到着すると、ネットワークはつまり、独自のネットワークアドレスがメッセージに追加、上のIPヘッダーTCPパケットに基づいてレイヤーを追加します。
場合は、データリンク層、およびデータリンクヘッダCRCを追加されます。
物理層に達すると、SMAC(ソースマシン、データの送信元のMACアドレス)は、DMAC(宛先マシン、データ受信者MACアドレス)を添加し、Typeフィールドされます。
データを送信する前に見つけることができ、それぞれの層が上層に基づいていくつかのコンテンツを追加します、下の図は、このプロセスではMSS、MTUの役割を示しています。
データMTUのイーサネット伝送は、限られた態様は、各イーサネットフレームは、64バイトの1518bytesを超えることができない最大値または最小サイズを有しています。イーサネットフレームヘッダ(DMAC宛先MACアドレス48ビット= 6Bytesに平面
+ SMACソースMACアドレスフィールド48ビット= 6Bytes +タイプ2バイト)14Bytes CRCチェックとトレーラ部4バイト(このセクションでは、我々は時々 、FCSを呼び出す)、ローカルキャリア残りの上位層プロトコルにも
データドメインはあなただけ1500Bytesを持つことができ、最大で、我々は値MTUそれを呼ぶことにします。
MTUの制限は、TCPプロトコルは、データを送信するときには、追加のTCPヘッダおよびIPヘッダを追加し、従って二つの部分、いずれかの面がTCPプロトコルであるので、1500バイトの最大値を送信することができるので
MSSで送信すべき実際のアプリケーションデータの最大サイズ。
MSS長手方向の長さ= MTU - IPヘッダー - TCPヘッダー
TCPヘッダ長がIPヘッダ長のIPv4は20バイトであり、IPV6 IPヘッダ長は、このように、40バイト、20バイトである:IPV4で、MSSは、イーサネット1460byteに達することが、IPV6、イーサネット(登録商標)で
MSSは1440byteに到達することができます。
なお、DATA MSS表現ではなく、データの真の長さを送信することができる時間の最大長。データはSO_SNDBUF MSSよりも大きい場合、送信者は、データを送信する場合、オペレーティングシステムがデータを入力します
行拆分,使得每一部分都小于MSS,这就是拆包,然后每一部分都加上TCP Header,构成多个完整的TCP报文进行发送,当然经过网络层和数据链路层的时候,还会分别
加上相应的内容。
需要注意: 默认情况下,与外部通信的网卡的MTU大小是1500个字节。而本地回环地址的MTU大小为65535,这是因为本地测试时数据不需要走网卡,所以不受到1500
的限制。
3、 Nagle算法
TCP/IP协议中,无论发送多少数据,总是要在数据(DATA)前面加上协议头(TCP Header+IP Header),同时,对方接收到数据,也需要发送ACK表示确认。
即使从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的包,其中包括1字节的有用信息和40字节的首部数据。这种情况转变成了4000%的消耗,这样的
情况对于重负载的网络来是无法接受的。
为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。
Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有
收到对方发送的ACK确认该数据已收到。
Nagle算法的规则:
1)如果SO_SNDBUF(发送缓冲区)中的数据长度达到MSS,则允许发送;
2)如果该SO_SNDBUF中含有FIN,表示请求关闭连接,则先将SO_SNDBUF中的剩余数据发送,再关闭;
3)设置了TCP_NODELAY=true选项,则允许发送。TCP_NODELAY是取消TCP的确认延迟机制,相当于禁用了Nagle 算法。
4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。