학교
[컴퓨터 네트워크] Chapter 3. Transport Layer (Part2) - (4)
일자 : 24-2 8주차 2차시 (1)
[2] TCP 연결 관리
: 데이터를 교환하기 전에 송신자와 수신자가 “핸드셰이크”를 수행한다.
연결을 설정(establish)하는 데 동의한다 (서로 연결을 설정하려는 의사를 확인한다).
연결 파라미터에 동의한다 (예: 시작 시퀀스 번호).
1) 코드로 보는 연결 과정

(1) Sender
Socket clientSocket = newSocket("hostname", "port number");(2) Reciver
Socket connectionSocket = welcomeSocket.accept();[3] 연결 설정에 동의하기
1) 2-way 핸드셰이크

Q: 2-way 핸드셰이크가 항상 네트워크에서 작동할까?
가변적인(variable) 지연: 네트워크 환경에 따라 지연 시간이 변동되어 메시지가 예측된 시간에 도착하지 않을 수 있다.
메시지 손실로 인한 재전송된 메시지 (예:
req_conn(x)): 전송 중인 메시지가 손실되면 다시 전송해야 하며, 이로 인해 추가적인 지연이나 혼란이 발생할 수 있다.메시지 순서 변경: 전송 중에 메시지의 순서가 뒤바뀔 수 있으며, 이는 수신 측에서 연결 요청과 응답을 올바르게 인식하지 못하게 만들 수 있다.
상대방을 “볼 수 없음”: 상대방 시스템이 일시적으로 응답하지 않거나 연결을 인식하지 못할 경우, 연결 설정이 이루어지지 않을 수 있다.
[3-1] 2-way 핸드셰이크 시나리오 설명
1) 문제 없는 시나리오

이 시나리오는 송신자와 수신자가 서로 문제없이 통신을 시작하는 이상적인 경우이다. 송신자는 연결 요청 메시지를 보내고, 수신자는 이를 받아 연결을 수락하는 메시지를 응답한다. 양쪽에서 응답이 확인되면 정상적으로 데이터 전송이 이루어진다.
2) 문제: 반쯤 열린 연결 (half open connection)

이 시나리오에서는 서버가 연결 요청을 받아들였으나 클라이언트가 응답하지 않는 상태가 발생한다. 클라이언트가 요청 후에 응답을 보내지 않거나 연결이 끊어져 서버에 남겨지면 반쯤 열린 연결 상태가 된다. 서버는 클라이언트가 존재한다고 가정하고 자원을 낭비하게 되며, 실제로는 클라이언트가 없기 때문에 정상적인 통신이 불가능해진다.
3) 문제: 중복 데이터가 수용됨

이 시나리오는 네트워크에서 메시지 재전송이나 순서 변경으로 인해 동일한 데이터가 여러 번 전송되는 경우이다. 송신자가 동일한 요청을 반복해서 보낼 때 수신자가 이를 인지하지 못하고 중복된 데이터를 수용하는 상황이 발생할 수 있다. 이를 통해 수신 측에서 의도하지 않은 데이터 중복 처리나 리소스 낭비가 일어날 수 있다.
4) 2-way 핸드셰이크 시나리오 요약
문제 없는 시나리오송신자와 수신자가 정상적으로 연결하여 데이터 전송이 이루어짐.
반쯤 열린 연결 (half open connection)클라이언트가 응답하지 않거나 사라져, 서버에 남은 연결이 자원을 낭비하게 됨.
중복 데이터 수용메시지 중복 전송으로 인해 수신자가 중복 데이터를 받아 의도치 않은 데이터 중복 발생.
[3-2] TCP 3-way handshake

1) 3-way 핸드셰이크 과정
SYN 패킷 전송: 클라이언트가 서버에 연결을 요청하는 신호를 보s낸다. 이때 SYN(Synchronize) 플래그가 설정된 패킷을 보내며, 초기 시퀀스 번호(x)를 포함함한다.
SYN-ACK 패킷 전송: 서버는 클라이언트의 연결 요청을 받고, 승인과 함께 자신의 초기 시퀀스 번호(y)를 알려준다. SYN과 ACK(Acknowledgement) 플래그가 모두 설정된 패킷을 보낸다.
ACK 패킷 전송: 클라이언트는 서버의 응답을 받고, 최종 확인 메시지를 보낸다. 서버의 시퀀스 번호를 확인하고 ACK 플래그를 설정하여 보낸다.
2) 각 상태
클라이언트 상태LISTEN -> SYN SENT -> ESTAB
서버 상태LISTEN -> SYN RCVD -> ESTAB
3) 각 상태의 의미
LISTEN: 서버 소켓이 열려 있고, 클라이언트의 연결 요청을 기다리는 상태이다.
SYN-SENT: 클라이언트가 SYN 패킷을 보내고 서버의 응답을 기다리는 상태이다.
SYN-RCVD: 서버가 SYN-ACK 패킷을 보내고 클라이언트의 응답을 기다리는 상태이다.
ESTABLISHED: 양쪽 모두 연결이 확립되어 데이터를 주고받을 수 있는 상태이다.
[4] TCP 연결 종료

1) 특징
클라이언트와 서버는 각각 연결을 종료
FIN 비트가 1인 TCP 세그먼트를 전송
수신한 FIN에 대해 ACK 응답
FIN을 수신하면, ACK와 자신의 FIN을 동시에 전송할 수 있음
동시에 FIN을 교환하는 상황을 처리할 수 있음
2) 각 상태
클라이언트 상태ESTAB -> FIN_WAIT_1 -> FIN_WAIT_2-> TIMED_WAIT -> CLOSED
서버 상태ESTAB -> CLOSE_WAIT -> LAST_ACK -> CLOSED
3) 각 상태의 의미
ESTAB (Established)
연결이 정상적으로 설정된 상태.
FIN_WAIT_1
클라이언트가 연결을 종료하려고 FIN을 보낸 상태.
클라이언트는 종료 요청을 보냈고, 서버로부터 ACK를 기다리는 중.
FIN_WAIT_2
서버의 FIN을 기다리는 상태.
클라이언트는 서버가 연결 종료 요청을 보낼 때까지 대기.
TIMED_WAIT
연결 종료를 완료한 후, 양쪽 시스템이 충분한 시간을 기다리며 연결이 완전히 종료되도록 보장하는 상태.
일정 시간 동안 대기하여 FIN이 손실되는 상황을 방지함.
CLOSED
연결이 완전히 종료된 상태.
CLOSE_WAIT
서버가 클라이언트의 종료 요청을 받았으나, 아직 연결을 종료하지 않은 상태.
서버는 이 상태에서 애플리케이션이 종료 처리를 하기 전에 대기.
LAST_ACK
서버가 자신의 종료 요청을 보낸 후, 마지막 ACK를 기다리는 상태.
서버는 클라이언트가 보내는 ACK를 수신하면 연결을 완전히 종료.
[5] TCP 상태 전이 다이어그램 정리

TCP 연결 과정에서 나타나는 다양한 상태를 설명하는 표입니다.
상태 | 설명 |
|---|---|
CLOSED: | 연결이 존재하지 않는 상태이다. 새로운 연결을 시작하기 위한 초기 상태이다. |
LISTEN: | 수동적인 오픈 상태로, 다른 호스트로부터의 연결 요청을 기다리고 있다. |
SYN-SENT: | 연결 요청(SYN)을 보내고 상대방의 응답을 기다리는 상태이다. |
SYN-RCVD: | 상대방으로부터 SYN+ACK를 받고, 자신의 ACK를 보내기 전 상태이다. |
ESTABLISHED: | 연결이 성공적으로 설정되어 데이터를 주고받을 수 있는 상태이다. |
FIN-WAIT-1: | 연결 종료를 요청하기 위해 FIN 패킷을 보내고 상대방의 응답을 기다리는 상태이다. |
FIN-WAIT-2: | 상대방으로부터 FIN에 대한 ACK를 받고, 상대방의 연결 종료 요청을 기다리는 상태이다. |
CLOSE-WAIT: | 상대방으로부터 FIN을 받고 ACK를 보냈지만, 아직 자체적인 연결을 종료하지 않은 상태이다. |
TIME-WAIT: | 상대방의 최종 ACK를 받고 일정 시간 동안 대기하는 상태이다. 이는 상대방이 보낸 패킷이 손실될 경우를 대비하여 재전송 기회를 주기 위한 것이다. |
LAST-ACK: | 상대방으로부터 FIN을 받고 ACK를 보냈으며, 상대방의 최종 ACK를 기다리는 상태이다. |
CLOSING: | 양쪽 모두 연결 종료를 동시에 요청한 상태이다. |
### [6] 키워드 정리 |
Reliable data transfer
데이터가 전송 중 손실되거나 오류가 발생하지 않도록 보장하는 전송 방식이다. 일반적으로 오류 검출 및 복구 메커니즘을 사용한다.
Stop-and-wait
송신자가 패킷을 보낸 후, 그 패킷에 대한 ACK를 수신할 때까지 기다리는 방식이다. ACK 수신 후 다음 패킷을 전송한다.
ACK, NCK
ACK (Acknowledgment): 수신자가 수신한 데이터에 대해 성공적으로 수신했다고 송신자에게 알려주는 메시지이다.
NCK (Negative Acknowledgment): 수신자가 데이터 오류를 감지한 경우 송신자에게 오류를 알리는 메시지이다.
Sequence number
전송되는 데이터의 순서를 추적하기 위한 고유한 번호이다. 패킷이 올바르게 정렬되고 재조립될 수 있도록 돕는다.
Rdt 3.0
신뢰성 있는 데이터 전송 프로토콜의 3rd 버전으로, 패킷 손실 및 오류를 처리하기 위한 기능을 포함한다. 송수신자는 수신 확인(ACK)과 오류 재전송을 통해 신뢰성을 확보한다.
Pipelining
데이터를 연속적으로 보내면서, 각 패킷에 대해 ACK를 기다리지 않고 여러 패킷을 동시에 전송하는 방식이다.
Go-Back-N
송신자가 최대 N개의 패킷을 동시에 전송하고, 수신자가 오류를 발견한 경우 해당 패킷 이후 모든 패킷을 재전송하는 방식이다.
Cumulative ACK
수신자가 수신한 데이터 중 가장 큰 순차적 번호까지의 패킷을 확인했다는 ACK를 보낸다. 즉, 마지막으로 올바르게 수신한 패킷의 번호를 ACK한다.
Selective repeat
송신자가 여러 패킷을 동시에 전송하되, 오류가 발생한 패킷만 다시 전송하는 방식이다. 재전송할 패킷을 선택적으로 결정한다.
Selective repeat dilemma
선택적 재전송 방식에서 발생할 수 있는 문제로, 패킷의 재전송 순서와 ACK의 도착 순서가 맞지 않아 발생할 수 있는 혼란이다.
TCP Flow control
TCP 연결에서 수신자가 처리할 수 있는 데이터 양을 송신자에게 알려주어, 수신자의 버퍼 오버플로우를 방지하는 메커니즘이다.
TCP Segment
TCP 프로토콜에서 데이터를 전송하는 기본 단위로, 헤더와 데이터로 구성된다. 각 세그먼트는 연결된 두 호스트 간의 데이터 전송을 담당한다.
SYN, FIN
SYN (Synchronize): TCP 연결을 시작할 때 사용되는 제어 비트로, 연결 초기화 요청을 나타낸다.
FIN (Finish): 연결 종료를 요청할 때 사용되는 제어 비트로, 연결 종료 요청을 나타낸다.
TCP round trip time
송신자가 데이터를 보내고, 수신자가 ACK를 보낸 후 다시 송신자가 ACK를 수신할 때까지의 시간이다.
TCP timeout
송신자가 데이터를 보내고 일정 시간 동안 ACK를 받지 못할 때 발생하는 시간 초과이다. 초과 시간이 지나면 패킷을 재전송한다.
Duplicate ACK
동일한 ACK를 여러 번 수신하는 경우로, 주로 패킷 손실을 알리는 신호로 사용된다. 송신자는 이를 통해 빠르게 패킷을 재전송할 수 있다.
TCP fast retransmit
중복된 ACK를 받으면 손실된 패킷을 빠르게 재전송하는 메커니즘이다. TCP 타임아웃을 기다리지 않고 패킷을 재전송한다.
TCP Handshake
TCP 연결을 설정하는 과정으로, 송수신자 간의 연결을 확립하는 절차이다.
2-way handshake
두 개의 메시지(요청, 응답)로 연결을 설정하는 프로토콜이다. TCP에서 연결을 설정하는 데 사용되지 않으며, 주로 간단한 프로토콜에서 사용된다.
3-way handshake
TCP에서 연결을 설정할 때 사용되는 과정으로, 클라이언트가 SYN을 보내고, 서버가 SYN+ACK를 응답하고, 클라이언트가 다시 ACK를 보내는 방식이다.
Closing a TCP connection
TCP 연결을 종료하는 과정으로, FIN을 보내고 ACK를 받으며 연결 종료를 처리한다. 연결이 종료되면 CLOSED 상태로 전환된다.
