Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State |
2. TCP 연결 과정 및 상태 (3 way handshake)
클라이언트 (상태) |
|
서버(상태) |
설명 |
- |
LISTEN |
서버 데몬이 특정 포트(22,80 등)에 대해 연결을 기다리는 상태 |
|
SYN-SENT |
-> SEQ, SYN -> |
SYN-RECV |
클라이어트에서 SYN 신호를 보내어 서버에서 SYN 신호를 받음 |
ESTABLISHED | <- SEQ, SYN, ACK <- | SYN-RECV | 서버에서 ACK 신호를 클라이언트에 보냄 |
ESTABLISHED | -> SEQ, ACK -> | ESTABLISHED | 클라이언트에서 ACK 신호를 서버에 보냄. 이후부터 상호 간에 데이터(Data)를 송수신 함 |
참고1) Windows와 Solaris는 SYN_RECEIVED, FreeBSD는 SYN_RCVD로 상태가 표시됨
참고2) SYN_RECV가 많이 보인다면, TCP SYN Flooding 공격을 받았을 수도 있음
3. TCP 종료 과정 및 상태 (4 way handshake)
종료에서 클라이언트 의미는 먼저 소켓을 close() 시스템 콜을 호출한 쪽(active closing)을 말한다. 즉 서버 애플리케이션에서 먼저 close()를 호출한다면, 클라이언트와 서버의 상태가 바뀌어서 나타날 수 있다.
클라이언트 (상태) active closing |
| 서버(상태) passive closing | 설명 |
FIN-WAIT-1 | -> SEQ, ACK, FIN -> | CLOSE-WAIT | socket이 닫히고, 종료되고 있는 상태. 서버의 응답은 받을 수 있음 |
FIN-WAIT-2 | <- SEQ, ACK <- | CLOSE-WAIT | 서버에서 ACK를 보내, 클라이언트는 ACK를 받은 상태임 |
TIME-WAIT | <- SEQ, ACK, FIN <- | LAST-ACK | 서버에서 ACK 신호를 클라이언트에 보냄 |
TIME-WAIT | -> SEQ, ACK -> | CLOSED | 클라이언트에서 종료 ACK를 보냄 |
CLOSED | 연결이 종료됨 |
참고1) Solaris는 FIN_WAIT_1, FIN_WAIT_2로 표시됨
참고2) 리눅스 기준 FIN-WAIT-2 상태 시간은 net.ipv4.fin_timeout 파라미터 변경으로 수정 가능하나, TIME-WAIT 상태 시간은 커널에 1분으로 설정되어 있음. 변경하기 위해서는 커널을 재빌드해야 수정 가능함
그림. TCP Status and OPeration