フルとハーフ接続キューキューTCPコネクションについて

ターン:https://www.toutiao.com/a6721163619758768647/ 

 

知識キュー、バックログ、でTCP 3ウェイハンドシェイクのようなtcp_abort_on_overflowの二つの概念があります。一般的な異常な接続サービスは、接続が拒否などの他の多くの問題があります。いくつかのヘルプのトラブルシューティングツールと組み合わせて、この知識を理解することによって効果的に生産に登場するサービスを接続し、いくつかの異常な問題を解決します。これらの以下の分析について説明します。

A、TCP 3ウェイハンドシェイク

 

 

 

握手

 

  • まず、クライアントは、サーバのSYNハンドシェイクに送信します
  • 第二:サーバは、キュー内の半関連情報に接続されているクライアントに返信SYN、SYN + ACKを受け取った後、サーバ。
  • 第三には、クライアントがサーバの応答SYN + ACK、ACKを受け取った後、ACKより多くの異なる状況を受信した後、承認された+ ACKのSYNサーバーの受信、サーバークライアントがどのtcp_abort_on_overflowパラメータ(異なる方法で処理し、キューを受け入れること全体の接続キューに関するいっぱいです)

 

 

 

ソケット3ウェイハンドシェイクの状態の列挙

  • LISTEN:リモートTCPポートからの接続要求を待機します
  • SYN-SENT:接続要求を送信した後、接続要求待ちに一致します
  • SYN-RECEIVED:接続要求を受信した後、接続要求確認待ちを送信します
  • ESTABLISHED:オープン接続を表し、データをユーザに送信することができます

二、フルとハーフ接続キュー接続キュー

 

2つのキューハンドシェイクがあります。

  • 完全な接続キュー(待ち行列を受け入れます)
  • 半接続キュー(SYNSキュー)

 

分析:(クライアントがサーバーのSYNサーバーに到達したクライアント)最初のハンドシェークTCPは接続キューに新しいエントリを作成しませんが完了すると、接続は、第3のハンドシェイク(顧客が完了しなくなるまで、この1つはキューに残ります最後までサーバーへのSYN ACK)。3ウェイハンドシェイクが正常に完了した場合、それはキューの接続端に接続キューを完了することはありません完了しました。プロセスの呼び出しは()を受け入れる場合は、接続キューのチームヘッドエントリがプロセスに返されます完了しました。

 

第三に、第三のサーバハンドシェーク特定のアプローチ

 

シナリオ1:完全な接続未満

当server收到client的ack后会先判断全连接队列accept queue是否已满,如果队列未满则从半连接队列拿出相关信息存放入全连接队列中,之后服务端accept()处理此请求。

场景2:当全连接已满且tcp_abort_on_overflow = 0

server会扔掉client 发过来的ack。之后隔一段时间server会重发握手第二步的syn+ack包给client,如果客户端连接一直排队不上等待超时则会报超时异常。

场景3:全连接已满且tcp_abort_on_overflow = 1时

server会发送一个reset包给client,表示废除这个握手过程和这个连接(客户端会报connection reset by peer异常)

四、关于backlog

backlog表示全连接队列(已连接未处理队列)的大小,该值默认为50。

 

 

当全连接队列满时则会根据tcp_abort_on_overflow的值做出相应的处理方式

 

//Linux查看tcp_abort_on_overflow值
cat /proc/sys/net/ipv4/tcp_abort_on_overflow


五、总结

TCP存在两个队列(全连接队列和半连接队列),第一次握手后TCP会产生的新项并先存放到半连接队列中。当完成三次握手之后项会移动到全连接队列里(全连接队列默认大小backlog值是50)。如果当全连接队列满了server则会根据tcp_abort_on_overflow 的值来做对应的处理,,值为0则丢弃当前客户端的ack,值为1则废弃当前握手过程与连接。

 

おすすめ

転載: www.cnblogs.com/python-xiakaibi/p/12128156.html