728x90
728x90
Termination의 종류
TCP는 두 가지 연결 해제 방식이 있다.
- 4-Way Handshake를 통한 연결 해제
- RST(Reset)을 통한 연결 해제
4-Way Handshake
- 연결 종료는 양쪽 호스트 모두 먼저 시도할 수 있다.
- 편의를 위해 양 쪽 Host를 각각 클라이언트, 서버라고 부르고 설명한다.
- 연결을 먼저 요청하는 Host ⇒ 클라이언트
- 연결을 요청받는 Host ⇒ 서버
- 실제로 TCP는 양방향 통신이기에 ‘클라이언트-클라이언트’의 형태가 존재한다.
4-Way-Handshake 에서 사용되는 TCP 헤더 필드
Sequence Number
- Segment에 있는 첫 번째 바이트의 바이트 스트림 번호다.
- TCP는 데이터를 단지 순서대로 정렬되어 있는 바이트 스트림으로 본다.
- ex) 0~999, 1000~1999의 Segment를 보낼 때 seq# = 각각 0, 1000
- TCP 연결, 종료 시에는 Sequence Number를 임의의 랜덤 값으로 설정한다.
- Sequence Number가 노출되면 공격자가 위조 패킷을 보낼 수 있어 보안을 위해 랜덤 값으로 설정한다.
Acknowledgement Number
- 받고 싶은 다음 바이트 번호를 의미한다.
- ex) 0~999, 1000~1999의 Segment를 받았을 때 ack# = 각각 1000, 2000
Control bits
- ACK(Acknowledgement)
- 패킷을 받았다는 응답을 할 때 사용한다.
- Acknowledgement Number가 유효한지를 나타낸다.
- 최초 연결의 첫 번째 세그먼트를 제외한 모든 Segment의 ACK 비트는 1로 설정한다.
- 최초 연결의 첫 번째 Handshake 과정에서는 응답할 요청이 없기 때문이다.
- FIN(Finish)
- TCP 연결을 종료할 때 사용한다.
- 더 이상 전송할 데이터가 없음을 의미한다.
- RST(Reset)
- TCP 연결을 강제로 종료할 때 사용한다.
- 비 정상적인 세션 연결 끊기에 해당한다.
- 연결을 즉시 끊고자 할 때 사용한다.
Half-Close 기법
처음 보내는 종료 요청인 FIN 패킷에 실질적으로 ACK가 포함되어 있는데, 이는 “Half-Close 기법” 을 사용하기 때문이다.
- 즉, 연결을 종료하려고 할 때 완전히 종료하지 않고 반만 종료한다.
- Half-Close 기법을 사용하면 종료 요청자가 처음 보내는 FIN 패킷에 ACK를 함께 담아서 보낸다.
- 이때 ACK는 "일단 연결은 종료할건데, 귀는 열어둘게. 이 승인 번호(ACK)까지 처리했으니까 더 보낼 거 있으면 보내"를 의미한다.
- 이후 수신자가 남은 데이터를 모두 보내고 나면 다시 요청자에게 FIN 패킷을 보냄으로써 모든 데이터가 처리되었다는 것을 알린다.
- 요청자는 나머지 반을 닫으면서 좀 더 안전하게 연결을 종료할 수 있다.
4-Way-Handshake 과정
Port 상태 정보
- ESTAB : 포트가 연결된 상태
- CLOSE-WAIT : 상대방의 FIN(종료 요청)을 받은 상태
- 상대방 FIN에 대한 ACK를 보내고 애플리케이션에 종료를 알린다.
- LAST-ACK : CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태
- FIN-WAIT-1 : 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
- FIN-WAIT-2 : 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다린다.
- CLOSING : 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태
- TIME-WAIT : 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태
- 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED로 전이한다.
- CLOSED : 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
[step 1] : 클라이언트 ———(FIN)———> 서버
- 클라이언트가 서버에게 연결 종료를 요청하는 FIN 세그먼트를 보낸다.
- 세그먼트 헤더 내에 FIN 비트를 1로 설정한다.
- 이때 FIN 패킷에는 실질적으로 ACK도 포함되어있다.
- 클라이언트는 전송 후 FIN-WAIT-1 상태가 된다.
[step 2] : 클라이언트 <———(ACK)——— 서버
- 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보내고 자신의 통신이 끝날때까지 기다린다.
- 아직 남은 데이터가 있다면 마저 전송을 마친 후에 close( )를 호출한다.
- 클라이언트는 ACK를 받은 후에 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다린다. (FIN_WAIT_2)
[step 3] : 클라이언트 <———(FIN)——— 서버
- 서버가 데이터를 모두 보냈다면, 연결 종료에 합의 한다는 의미로 FIN 패킷을 클라이언트에게 보낸다.
- 이후 ACK를 받을때까지 기다리는 LAST_ACK 상태가 된다.
[step 4] : 클라이언트 ———(ACK)———> 서버
- 클라이언트는 FIN을 받고, 응답 ACK를 서버에게 보낸다.
- 아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다린다.
- TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지한다.
[after]
- 서버는 ACK를 받은 이후 소켓을 닫는다 (Closed)
- TIME_WAIT 시간이 끝나면 클라이언트도 소켓을 닫는다 (Closed)
3-way-handshake와 차이가 나는 이유?
클라이언트가 데이터 전송을 마쳤다고 하더라도 서버는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문이다.
서버는 마지막 FIN 을 보내기 전에 아직 전송하지 못한 데이터를 전송할 수 있다.
그러나, 데이터가 유실되어 재전송하거나, 지연되어 FIN보다 늦게 도착할 수 있다.
따라서, 클라이언트는 FIN을 받고도 TIME_WAIT를 통해 혹시 모를 패킷 수신을 기다린다.
Abrupt connection release(갑작스런 연결 해제)
RST(TCP reset) 세그먼트가 전송되면 갑작스러운 연결 해제가 수행된다.
- ACK를 보내거나 기다리는 작업이 필요하지 않고, 바로 연결이 종료된다.
- RST 비트를 1로 설정한 세그먼트를 전송한다.
- 송신자는 패킷을 보내고 바로 연결을 종료한다.
- 수신자는 패킷을 받으면 바로 연결을 종료한다.
RST를 사용해 연결을 종료하는 경우
- 보안 위반의 경우
- 악성 코드가 존재한다고 판단되면 연결을 즉시 종료하여 보호할 수 있다.
- 자원이 부족해 자원 할당을 해제해야하는 경우
- TCP 연결에 장애가 발생한 경우
- 즉시 연결을 끊고 새로운 연결을 시도해 정상적인 통신으로 돌아올 수 있다.
참고
도서 : Computer Networking : A top-Down Approach by James F. Kurose, Keith W. Ross
728x90
728x90
'Computer Science > Computer Network' 카테고리의 다른 글
DHCP (0) | 2023.04.04 |
---|---|
IP(IPv4, IPv6), NAT (0) | 2023.04.03 |
OSI 7 계층 (0) | 2023.04.03 |
TCP, UDP (0) | 2023.04.02 |
3-Way Handshake (0) | 2023.04.02 |