tcp ip
EditTCP 특징
- 신뢰성
- 연결지향
- 바이트스트림
- 흐름제어
- 양반향 통신
- 혼잡제어
Handshaking
연결
(Client → Server) SYN
(Server → Client) SYN+ACK
(Client → Server) ACK
Close
(Client → Server) FIN
(Server → Client) ACK (Server : CLOSE_WAIT, Client: TIME_WAIT)
(Server → Client) FIN
(Client → Server) ACK
서버가 FIN 패킷을 수신한 이후, 종료 때까지 약간의 시간 지연 Peer가 FIN보내면 이쪽에서 닫기 전까지 CLOSE_WAIT 상태
CLOSE_WAIT는 timeout이 나지 않는다.
Linux tuning
- 리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기 - 1편
- 리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기 - 2편
- 리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기 - 3편
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 이 대기
- net.core.somaxconn
- size of the connection listening queue, socket당 listen queue 최대 크기
- default 128
- /etc/sysctl.conf 파일에
net.core.somaxconn =1024
- net.core.netdev_max_backlog : 들어온 패킷이 프로세서에서 처리되기까지 대기하는 queue
- net.ipv4.tcp_max_syn_backlog : 전체 listen queue 최대 크기
- Apache 설정에
ListenBacklog 1024
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
- tcp_tw_reuse와 tcp_tw_recycle : tw_use는 outing 트래픽에 대해 로컬 포트가 모자랄 경우, TW 상태에 있는 소켓을 재사용할 수 있게 해줍니다.
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'