tcp ip

Edit

TCP 특징

Handshaking

https://mindnet.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-22%ED%8E%B8-TCP-3-WayHandshake-4-WayHandshake

연결

  1. (Client → Server) SYN

  2. (Server → Client) SYN+ACK

  3. (Client → Server) ACK

Close

  1. (Client → Server) FIN

  2. (Server → Client) ACK (Server : CLOSE_WAIT, Client: TIME_WAIT)

  3. (Server → Client) FIN

  4. (Client → Server) ACK

서버가 FIN 패킷을 수신한 이후, 종료 때까지 약간의 시간 지연 Peer가 FIN보내면 이쪽에서 닫기 전까지 CLOSE_WAIT 상태

CLOSE_WAIT는 timeout이 나지 않는다.

CLOSE_WAIT & TIME_WAIT 최종 분석

Linux tuning

TCP buffer size

sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 16384 16777216"

Queue size

syn queue: 3-way handshake 중인 connection 이 대기

sysctl -w net.core.somaxconn=4096
sysctl -w net.core.netdev_max_backlog=16384
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_syncookies=1

/etc/sysctl.conf 를 수정하면 재부팅해도 동일하게 적용됨. sudo /sbin/sysctl -p /etc/sysctl.conf 로 반영

Ports

sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sysctl -w net.ipv4.tcp_tw_recycle=1

Congestion Control

sysctl net.ipv4.tcp_available_congestion_control
sysctl -w net.ipv4.tcp_congestion_control=cubic

File Descriptors

/etc/security/limits.conf

Monitoring

netstat -n -t | grep 'TIME_WAIT'