[Problema] registrou um recorde ConnectionTimeout solução de problemas

Recentemente fazendo testes de desempenho, descobrimos que cerca de 1% da transação sugiro o seguinte erro quando ligar sistema de terceiros

nested
exception is org.apache.commons.httpclient.ConnectTimeoutException: The host did
not accept the connection within timeout of 10000 ms

No início, a idéia em espera pode google movimento do Google, os resultados não encontrar a solução, o nosso único passo a passo para a investigação, o processo de investigação, sob o registro abaixo.

problema local de captura

Questões relacionadas com a rede, primeiro agarrar um saco, tcpdump ir onda.

tcpdump -i eth0 host xxx.xxx.xxx.xxx > tcp.dmp

Trechos de todo o conteúdo de uma conexão TCP, a partir dos pacotes de três vias aperto de mão para enviar quatro vezes acenando um boletim será explicado em três partes

Packet formato de explicar
时间戳 协议类型 请求方地址>接收方地址 Flags [xxx], seq xxx,......,length 

Protocolo Tipo : aqui para o protocolo TCP / IP para IP

Bandeiras valores e significados comuns

marca significado
S Ou seja, SYN, para estabelecer uma conexão
. Isso é ACK, tal como pode ser utilizado em combinação com outro representante [S.] de um recibo de SYN ACK
P Isso PSH, indica que os dados de recepção para a camada superior imediatamente
F Ou seja, FIN, a desconexão
Três vias aperto de mão
09:23:00.038908 IP 192.168.1.100.51777 > 192.168.1.200.39045: Flags [S], seq 2590465106, win 29200, options [mss 1460,sackOK,TS val 1752507811 ecr 0,nop,wscale 7], length 0
09:23:00.039329 IP 192.168.1.200.39045 > 192.168.1.100.51777: Flags [S.], seq 148046299, ack 2590465107, win 14480, options [mss 1460,sackOK,TS val 2174555693 ecr 1752507811,nop,wscale 7], length 0
09:23:00.039341 IP 192.168.1.100.51777 > 192.168.1.200.39045: Flags [.], ack 1, win 229, options [nop,nop,TS val 1752507811 ecr 2174555693], length 0

image-20200322180642831

  1. O cliente envia SYN=1,seq=随机生成的序号para o servidor, o conteúdo correspondente ao primeiro pacote

  2. A resposta do servidor SYN=1,seq=服务端随机序号,ack=第一步中的seq+1para o cliente, correspondente à segunda conteúdo da embalagem

  3. O cliente envia SYN=0,seq=第一步中的seq+2,ack=服务端的随机序号+1para o servidor, o terceiro pacote correspondente a

    Neste ponto conexão é estabelecida

    ligação TCP é full-duplex, quer C-> S, pode S-> C

transmissão de pedido / resposta recepção
09:23:00.039406 IP 192.168.1.100.51777 > 192.168.1.200.39045: Flags [P.], seq 1:167, ack 1, win 229, options [nop,nop,TS val 1752507811 ecr 2174555693], length 166
09:23:00.039426 IP 192.168.1.100.51777 > 192.168.1.200.39045: Flags [P.], seq 167:2259, ack 1, win 229, options [nop,nop,TS val 1752507811 ecr 2174555693], length 2092
09:23:00.039778 IP 192.168.1.200.39045 > 192.168.1.100.51777: Flags [.], ack 167, win 122, options [nop,nop,TS val 2174555693 ecr 1752507811], length 0
09:23:00.039784 IP 192.168.1.200.39045 > 192.168.1.100.51777: Flags [.], ack 2259, win 155, options [nop,nop,TS val 2174555693 ecr 1752507811], length 0
09:23:00.533102 IP 192.168.1.200.39045 > 192.168.1.100.51777: Flags [P.], seq 1:972, ack 2259, win 155, options [nop,nop,TS val 2174555817 ecr 1752507811], length 971
09:23:00.533114 IP 192.168.1.100.51777 > 192.168.1.200.39045: Flags [.], ack 972, win 244, options [nop,nop,TS val 1752507935 ecr 2174555817], length 0

image-20200322180941689

  1. Enviou uma vez a cada mensagem precisa ser feito para acabar com um ACK recibo, TCP para garantir a transmissão confiável de
  2. Pacote 1 Pacote 2 e a solicitação do cliente para o servidor, o pacote 3 e 4 pacotes são servidor recibos, os conteúdos do pacote de resposta do pacote do servidor 5 para o cliente 6 em resposta ao recebimento fazer.
quatro acenando
09:23:00.533121 IP 192.168.1.200.39045 > 192.168.1.100.51777: Flags [F.], seq 972, ack 2259, win 155, options [nop,nop,TS val 2174555817 ecr 1752507811], length 0
09:23:00.533166 IP 192.168.1.100.51777 > 192.168.1.200.39045: Flags [F.], seq 2259, ack 973, win 244, options [nop,nop,TS val 1752507935 ecr 2174555817], length 0
09:23:00.533479 IP 192.168.1.200.39045 > 192.168.1.100.51777: Flags [.], ack 2260, win 155, options [nop,nop,TS val 2174555817 ecr 1752507935], length 0

image-20200322181001461

Porque aqui o protocolo HTTP eo sistema é fornecido na cabeça Connection=close, de modo que após o pedido é processado, o servidor irá fechar a conexão.

  1. O primeiro passo: os transmite servidor FINpara o cliente, o pacote correspondente 1.
  2. Passo: o recebimento do cliente ACKpara o servidor, o pacote correspondente 2.
  3. O terceiro passo: o cliente envia FINpara o servidor, o pacote correspondente 2.

Porque a segunda e terceira etapas são enviados do cliente para o servidor, quando o protocolo TCP aqui para fazer uma fusão, juntamente com o FIN e ACK enviado para o ponto, ele reduz o consumo de rede.

  1. Passo Quatro: servidor recibo ACKpara o cliente, o pacote correspondente 3, liberação conexão completa.

análise

Pacote é capturado, mas durante o teste de desempenho, o volume de negócios particularmente grande, se nós simplesmente analisar a mão, então o medo é encontrar o fim dos tempos, para o qual escreveu algum código Python para analisar tcpdump pacote, porque esta questão é um pedido problemas de conexão, seria um problema quando o three-way handshake, então o caso quando o seguinte código analisa a três vias aperto de mão.

Packet.py

o conteúdo do pacote de análise

import re


class Packet(object):
    '分组'

    timestamp = '00:00:00.000000'  # 时间戳
    from_addr = '0.0.0.0'  # 源地址
    to_addr = '0.0.0.0'  # 目的地址
    protocol_type = 'IP'  # 协议类型

    flags = '[S]'  
    seq = '0'
    ack = '0'
    length = 0  # 数据包长度

    def __init__(self, packet_str):
        hb = re.split(': ', packet_str)
        header = hb[0]
        body = hb[1]

        hs = re.split('[\s]', header)
        self.timestamp = hs[0]
        self.protocol_type = hs[1]
        self.from_addr = hs[2]
        self.to_addr = hs[4]

        bs = re.split(',\s', body)
        for b in bs:
            kv = re.split('\s', b, 1)
            k = kv[0]
            v = kv[1]
            if 'Flags' == k:
                self.flags = v
            elif 'seq' == k:
                if self.flags != '[P.]':
                    self.seq = v
            elif 'length' == k:
                self.length = int(v)
            elif 'ack' == k:
                self.ack = v

    def __str__(self):
        return self.timestamp + self.protocol_type + self.from_addr + '==>' + self.to_addr + self.flags + str(
            self.seq) + str(self.ack) + str(self.length)

ConnectionTimeoutAnalyze.py

Análise dmp conteúdo da embalagem

from tcpdump.Packet import Packet

client_addr = '192.168.1.100'
server_addr = '192.168.1.200.39045'

packet_times = {}  # 连接ID:时间
first_packets = [] #三次握手第一次的包

'''
第一步:syn=1,seq=xxx
第二步:syn=1,seq=yyy,ack=xxx+1
第三步:syn=0,seq=xxx+1,ack=yyy+1
'''
with open('C:\\Users\\xxx\\Desktop\\39045.dmp') as dmp:
    for line in dmp.readlines():
        line = str(line.strip())
        packet = Packet(line)
        if packet.from_addr.startswith(client_addr) and packet.flags == '[S]':
            first_packets.append(packet)

        id = packet.from_addr + packet.to_addr + packet.flags + 'ack=' + packet.ack
        if packet.flags != '[S.]':
            id = id + 'seq=' + packet.seq

        packet_times[id] = packet.timestamp

print('请求ID(客户端IP.端口\\请求序号)\t第一步时间\t\t第二步时间\t\t第三步时间')
for fpack in first_packets:
    sync_time = fpack.timestamp  # 第一步的时间
    id = fpack.to_addr + fpack.from_addr + '[S.]' + 'ack=' + str(int(fpack.seq) + 1)  # 第二步:ack=第一步的seq+1
    ack_time = packet_times.get(id)
    conn_time = None
    if ack_time is not None:
        conn_time = packet_times.get(fpack.from_addr + fpack.to_addr + '[.]ack=1seq=0')  # 第三步:ack=1,seq无值
    print(
        '[' + fpack.from_addr + '\\' + fpack.seq + ']\t' + sync_time + '\t\t' + str(ack_time) + '\t\t' + str(conn_time))

Pela análise de código, encontrada na segunda parte etapa criado quando o tempo de conexão é None, pode-se concluir a emissão de um pacote SYN pedido de recibo para o servidor não para ser honesto Shuaiguo a uma rede / o terceiro! [ ]

Acho que você gosta

Origin www.cnblogs.com/itaot/p/12547656.html
Recomendado
Clasificación