TCP 연결 성립 과정
TCP는 신뢰성을 확보할 때 '3-way handshake' 라는 작업을 진행한다.
- SYN 단계: 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN을 보낸다. ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀀스 번호를 말하며 이는 장치마다 다를 수 있다. (ex. 10000)
- SYN + ACK 단계: 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 다시 클라이언트에게 보내며 승인번호로 클라이언트에게 받은 ISN + 1 을 보낸다. (ex. 서버의 ISN: 5000 / 클라이언트한테 보내는 승인번호: 10001)
- ACK 단계: 클라이언트는 서버의 ISN + 1 한 값인 승인번호를 담아 ACK를 서버에 보낸다. (ex. 서버에 보내는 승인번호: 5001)
3 핸드 셰이크 과정 이후 신뢰성이 구축되고 데이터 전송을 시작한다.
TCP는 이 과정이 있어서 신뢰성이 있는 계층이라고 하며
UDP는 이 과정이 없어서 신뢰성이 없는 계층이라고 한다.
TCP 연결 해제 과정
TCP가 연결을 해제할 때는 4-way handshake 과정이 발생한다.
- 먼저 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 보낸다. 그리고 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다린다.
- 서버는 클라이언트로 ACK라는 승인 세그먼트를 보낸다. 그리고 CLOSE_WAIT 상태에 들어간다. 클라이언트가 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.
- 서버는 ACK를 보내고나서 일정 시간 이후에 클라이언트에게 FIN 이라는 세그먼트를 보낸다.
- 클라이언트는 TIME_WAIT 상태가 되고 다시 서버로 ACK 를 보내서 서버는 CLOSED 상태가 된다. 이후 클라이언트는 어느 정도 시간을 대기한 후 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결이 해제 된다.
이 과정 중 가장 눈 여겨봐야 할 것은 4번인 TIME_WAIT 이다. 그냥 연결을 닫으면 될텐데 왜 굳이 일정 시간 뒤에 닫을까?
- 지연 패킷이 발생할 경우
- 패킷이 뒤늦게 도달하고 이를 처리하지 못한다면 데이터 무결성 문제가 발생한다.
예를 들어 전체 데이터가 100일 때 일부 데이터인 50만 들어오는 현상이 발생할 수도 있다.
- 패킷이 뒤늦게 도달하고 이를 처리하지 못한다면 데이터 무결성 문제가 발생한다.
- 두 장치가 연결이 닫혔는지 확인하기 위해서
- 만약 LAST_ACK 상태에서 닫히게 되면 다시 새로운 연결을 하려고 할 때 장치는 줄곧 LAST_ACK 로 되어 있기 때문에 접속 오류가 날 것이다.
이러한 이유 때문에 TIME_WAIT 라는 시간이 필요한 것이다.
TIME_WAIT
소켓이 바로 소멸되지 않고 일정 시간 유지되는 상태를 말하며 지연 패킷 등의 문제점을 해결하는 데 쓰인다.
CentOS6, 우분투에는 60초로 설정 되어있고 윈도우는 4분으로 설정되어 있다. 즉 OS마다 조금씩 다를 수 있다.
'TIL' 카테고리의 다른 글
TIL 2024-03-01 간단한 BufferedReader 와 StringTokenizer 사용법 (0) | 2024.03.01 |
---|---|
TIL 2024-02-26 TCP/IP 인터넷 계층, 링크 계층 (0) | 2024.02.27 |
TIL 2024-02-24 TCP / IP 전승 계층 교환 방식 (0) | 2024.02.24 |
TIL 2023-02-23 TCP / IP 4계층 모델 (0) | 2024.02.23 |
TIL 2024-02-15 네트워크 토폴로지와 병목 현상, 네트워크 분류 (0) | 2024.02.15 |