[Problema] registrado un récord ConnectionTimeout solución de problemas

Recientemente hacer pruebas de rendimiento, se encontró que aproximadamente el 1% de la transacción podría sugerir el siguiente error al conectar sistemas de terceros

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

En un primer momento la idea en espera puede ir de google de Google, los resultados no encontraron la solución, nuestro único paso a paso para la investigación, el proceso de investigación de conformidad con el registro más adelante.

problema sitio de captura

Las cuestiones relacionadas con la red, primero agarrar una bolsa, tcpdump van ola.

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

Extractos de todo el contenido de una conexión TCP, desde los paquetes de enlace de tres vías para enviar a cuatro veces agitando un boletín de noticias se explicará en tres partes

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

Tipo de protocolo : aquí para el protocolo TCP / IP para IP

Banderas valores comunes y significado

marca significado
S Es decir, SYN, para establecer una conexión
. Es decir ACK, tal como puede ser usado en combinación con otros [S.] representante de una recepción de SYN ACK
PAG Eso PSH, indica que los datos de recepción a la capa superior inmediatamente
F Es decir, FIN, a la desconexión
Apretón de manos de tres vías
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

imagen-20200322180642831

  1. El cliente envía SYN=1,seq=随机生成的序号al servidor, el contenido correspondiente al primer paquete

  2. La respuesta del servidor SYN=1,seq=服务端随机序号,ack=第一步中的seq+1al cliente, correspondiente a la segunda contenido del paquete

  3. El cliente envía SYN=0,seq=第一步中的seq+2,ack=服务端的随机序号+1al servidor, el tercer paquete correspondiente a

    En este punto se establece la conexión

    conexión TCP es de dúplex completo, ya sea C-> S, puede s-> C

transmisión de petición de respuesta / recepción
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

imagen-20200322180941689

  1. Envían una vez las necesidades de cada mensaje por hacer para acabar con un ACK de recibo, TCP para asegurar una transmisión fiable de
  2. Paquete 1 Paquete 2 y la solicitud de cliente al servidor, paquete 3 y paquete 4 son servidor de recibos, el contenido del servidor 5 paquete de respuesta de paquetes al cliente 6 en respuesta a la recepción hacer.
cuatro agitando
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

imagen-20200322181001461

Debido a que aquí el protocolo HTTP, y el sistema se proporciona en la cabeza Connection=close, de modo que después de la petición se procesa, el servidor cerrará la conexión.

  1. El primer paso: los transmite servidor FINal cliente, el paquete correspondiente 1.
  2. Paso: recibo de cliente ACKal servidor, el paquete correspondiente 2.
  3. El tercer paso: el cliente envía FINal servidor, el paquete correspondiente 2.

Debido a que la segunda y tercera etapas son enviados desde el cliente al servidor, cuando el protocolo TCP aquí para hacer una fusión, junto con el FIN y ACK enviado a la par, se reduce el consumo de la red.

  1. Paso cuatro: servidor de recibo ACKal cliente, el paquete correspondiente 3, liberación de la conexión completa.

análisis

El paquete es capturado, pero durante la prueba de rendimiento, el volumen de negocio especialmente grande, si nos limitamos a analizar a mano, entonces el miedo es encontrar el final de los tiempos, para el que escribió algo de código Python para analizar tcpdump paquete, porque este tema es una solicitud problemas de conexión, lo que sería un problema cuando el enlace de tres vías, por lo que el caso cuando el siguiente código analiza el enlace de tres vías.

Packet.py

el contenido del paquete de análisis

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

el contenido del paquete de análisis DMP

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))

Por el análisis de código, que se encuentra en la segunda parte de escalón creado cuando el tiempo de conexión es Ninguno, se puede concluir a emitir un paquete SYN solicitud de confirmación al servidor no para ser honesto Shuaiguo a una red / el tercero! [ ]

Supongo que te gusta

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