TCP의 연결, 연결 해제 과정에 대해서 설명해주세요.
TCP란?
- TCP(Transmission Control Protocol)는 네트워크 프로토콜의 국제표준기준 OSI 7 계층(Open System Interconnect)의 4 계층 (Transport) 속하며, 3 계층(Network)의 IP 프로토콜과 같이 사용되기 때문에, TCP/IP 라고도 불린다
목적
TCP 의 사용의 가장 큰 목적은 컴퓨터에서 실행되는 프로그램 간 데이터 유실 없이 안정적으로 전송하는 것이다.
TCP 헤더
- 최소 20 byte ~ 최대 60 byte (옵션 지정시)
TCP Flag
Flag란 무엇인가를 기억해야 하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 프로그램에서 사용되는 미리 정의된 비트를 의미한다.
TCP Flag 종류
SYN (Synchronize) 연결 요청 플래그
- TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷이다.
- 시퀀스 번호를 임의로 설정하여 세션을 연결하는데 사용되며 초기에 시퀀스 번호를 보내게 된다.
ACK (Acknowledgement) 응답 플래그
- 상대방으로부터 패킷을 받았다는 것을 알려주는 패킷으로, 다른 Flag와 같이 출력되는 경우도 있다.
- 송신 측에서 수신 측 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보낸다. (일반적으로 +1을 하여 보낸다)
- ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단하여 재전송 하거나 다음 패킷을 전송한다.
FIN (Finish) 연결 종료 플래그
- 세션 연결을 종료시킬 때 사용되며, 더이상 전송할 데이터가 없음을 나타낸다.
RST (Reset) 연결 재설정 플래그
- 재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업이다.
- 비정상적인 세션 연결 끊기에 해당한다. 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
PSH (Push) 넣기 플래그
- 버퍼가 채워지기를 기다리지 않고 데이터를 받는 즉시 전달하는 Flag. 데이터는 버퍼링 없이 OSI 7 Layer Application Layer의 응용프로그램으로 바로 전달한다.
URG (Urgent) 긴급 데이터 플래그
- 긴급한 데이터의 우선순위를 다른 데이터의 우선순위보다 높여 긴급하게 데이터를 전달하는 Flag 이다.
TCP 연결과정(3-way-handshake)
[State 정보]
CLOSED
: 포트가 닫힌 상태LISTEN
: 포트가 열린 상태로 연결 요청 대기 중SYN_RECV
: SYNC 요청을 받고 상대방의 응답을 기다리는 중ESTABLISHED
: 포트 연결 상태TIME
-WAIT: Server로부터 FIN을 수신하더라도 일정시간(default: 240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정
- SYN(Synchronize Sequence Number)
- 활성 오픈이되면 클라이언트가 서버에
SYN
을 전송하여 수행한다.
- 활성 오픈이되면 클라이언트가 서버에
- SYN-ACK
- Server는
Listen
상태에서SYN
이 들어온 것을 확인한다. SYN
수신이 확인되면SYN_RECV
상태로 바뀌어SYN-ACK
로 응답한다.ACK
번호는 수신된 시퀀스보다 하나 더 큰 A+1로 설정되며, 서버가 패킷에 대해 선택한 시퀀스 번호는 또 다른 임의의 숫자인 B이다.- 그 후 Server는 다시
ACK
플래그를 받기 위해 대기상태로 변경된다.
- Server는
- ACK(Acknowledgement)
SYN + ACK
상태를 확인한 Client는 서버에게ACK
를 보낸다.- 시퀀스 번호는 수신된 승인 값 즉 A+1로 설정되고 ,승인 번호는 수신된 시퀀스 번호 즉 B+1보다 하나 큰 값으로 설정된다.
- 연결 성립(
Established
)이 된다.
1단계와 2단계(SYN
, SYN-ACK
)는 한 방향에 대한 시퀀스 번호를 설정하고 승인.
2단계와 3단계(SYN-ACK
, ACK
)는 다른 방향에 대한 시퀀스 번호를 설정하고 승인.
이 단계를 완료하면 클라이언트와 서버 모두 승인을 받고 전이중 통신이 설정
TCP 연결종료 및 상태변화(4-way-handshake)
- 클라이언트의 행동은 active하고 서버는 passive하다.
- 연결하고자 하는 것이 클라이언트면 연결을 종료하는 것도 클라이언트여야 한다.
- 클 → 서
FIN + ACK
- 연결을 끊자고 하는 클라이언트는
established
상태여야 연결을 끊을 수 있다. - 그러면 클라이언트가
established
상태에서 연결을 끊을려고FIN+ACK
를 같이 보낸다. FIN-WAIT-1
상태로 변경된다.- 서버는
CLOSE_WAIT
상태가 된다.
- 연결을 끊자고 하는 클라이언트는
- 서 → 클
ACK(Acknowledgement)
만 온 경우- 서버는
CLOSE-WAIT
상태로 변경된다. - Client는 Server에서
FIN
을 받기위해FIN-WAIT-2
상태로 변경된다.
- 서버는
FIN + ACK(Acknowledgement)
이 온 경우- 서버는
LAST_ACK
상태가 된다. - 서버측에서
FIN+ACK
가 오면 그때 클라이언트는TIME_WAIT
상태가 된다. → 이를 통해서도 클라이언트가 연결을 끊는 주체라는 것을 알 수 있다. 서버가TIME_WAIT
상태면 비정상적인 특수상황
- 서버는
- 클 → 서 ACK(Acknowledgement)
- Client는 해지 준비가 되었다는 정상응답인
ACK
를 Server에게 보낸다. - Client는 timout에 의해
CLOSED
상태로 변환된다.
- Client는 해지 준비가 되었다는 정상응답인
TIME-WAIT 시간동안(일부 공통 값은 30초, 1분 ~ 2분) 로컬 포트는 새 연결을 할 수 없다.
TIME-WAIT 상태는 의도치않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지 하며, 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 변경된다.