TCP란?
TCP는 네트워크 계층 중 전송 계층에서 사용하는 프로토콜 중 하나로, 신뢰성을 보장하는 연결형 서비스이다.
TCP 특징
- 전송되는 데이터의 신뢰성 보장 (흐름 제어, 혼잡 제어, 오류 제어)
- 파일전송에 주로 사용
- 가상 회선을 만들어 신뢰성을 보장
※ TCP가 가상회선 방식을 제공한다는 것은 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정한다는 말이다.
3-way-handshake
연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 사용하는 연결 확인 방식으로, 3번의 확인 과정을 거친다고 해서 3 way handshake라고 부른다.
TCP 3-way-handshake를 간단히 표현하면 다음과 같다.
- Client -> Server : 내 말 들려?
- Server -> Client : 잘 들려. 내 말은 들려?
- Client -> Server : 잘 들려!
SYN (synchronize sequence numbers) - 연결 확인을 위해 보내는 무작위의 숫자값 (내 말 잘 들려?)
ACK (acknowledgements) - Client 혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK (잘 들려)
이를 적용하면
A 프로세스(client)가 B 프로세스(Server)에 연결을 요청
1. A(CLOSED) -> B(LISTEN) : SYN(a)
- 프로세스 A가 연결 요청 메시지 전송 (SYN)
- 이 때 sequence number를 임의의 랜덤 숫자 a로 지정하고, SYN 플래그 비트를 1로 설정한 segment를 전송한다.
2. B(SYN_RCV) -> A(CLOSED) : ACK(a+1), SYN(b)
- 연결 요청 메시지를 받은 프로세스 B는 요청을 수락(ACK)했으며, 요청한 A 프로세스도 포트를 열어달라(SYN)는 메시지 전송
- 받은 메시지에 대한 수락에 대해서는 ACK number를 SYN number + 1 로 지정하여 표현한다. 그리고 SYN과 ACK 플래그 비트를 1로 설정한 segment를 전송한다.
3. A(ESTABLISHED) -> B(SYN_RCV): ACK(b+1)
- 마지막으로 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
- 이 떄, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.
ㅇ SYN (Synchronize) [연결시작,회선개설 용도]
- TCP 연결설정 초기화를 위한 순서번호의 동기화 ☞ TCP 연결 설정
. 연결요청 : SYN=1, ACK=0 (SYN 세그먼트)
. 연결허락 : SYN=1, ACK=1 (SYN+ACK 세그먼트)
. 연결설정 : ACK=1 (ACK 세그먼트)
ㅇ ACK (Acknowledgement)
- 확인응답 필드에 확인응답번호(Acknowledgement Number) 값이 셋팅됐음을 알림
. 1로 셋팅되면, 확인번호 유효함을 뜻함
. 0로 셋팅되면, 확인번호 미포함 (즉, 32 비트 크기의 확인응답번호 필드 무시됨)
- SYN 세그먼트 전송 이후(TCP 연결 시작후) 모든 세그먼트에는 항상 이 비트가 1로 셋팅됨
상태 설명
CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN 요청을 한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
즉 이 예시의 최종 PORT 상태 : A-ESTABLISHED, B-ESTABLISHED (연결 수립)
- Client가 연결하고자 하는 Server에게 seq port (2915269997) 전송
- Server가 해당 seq pory를 받고 해당 숫자에 1을 더한 ack port (2915269998) + Client의 연결을 확인하고자 하는 seq port (1458477026) 전송
- Client가 Server의 seq port를 받고 해당 숫자에 1을 더한 ack port (1458477027)을 Server에 전송
TCP 4-way-handshake
3 way handshake와 반대로 가상 회선 연결을 해제할 때 주고 받는 확인작업이다. 이 역시 4번의 확인과정을 거친다고 하여 4 way handshake라고 부른다.
TCP 4 way handshake를 간단히 표현하면 다음과 같다.
- A -> B: 나는 다 보냈어. 이제 끊자!
- B -> A: 알겠어! 잠시만~
- B -> A: 나도 끊을게!
- A -> B: 알겠어!
FIN (Finish) - TCP 연결을 종료하겠다는 메시지
A 프로세스(client)가 B 프로세스(Server)에 연결 해제를 요청
1. A(ESTABLISHED) -> B(ESTABLISHED) : FIN
- 프로세스 A가 연결을 종료하겠다는 FIN 플래그를 전송
- 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
2. B(CLOSE_WAIT) -> A(FIN_WAIT_1) : ACK
- 프로세스 B는 일단 확인 메시지(ACK)를 보내고 자신의 통신이 끝날 때까지 기다린다.
- ACK Number를 SYN Number +1로 지정하고, ACK 플래그 비트를 1로 설정한 segment를 전송한다.
- 그리고 자신이 전송할 데이터가 남아있다면 이어서 계속 전송한다. (클라이언트 쪽에서도 아직 서버로부터 받지 못한 데이터가 있을 것을 대비해 일정 시간동안 세션을 남겨놓고 패킷을 기다린다. 이를 TIME_WAIT 상태라고 한다.)
3. B(CLOSE_WAIT) -> A(FIN_WAIT_2) : FIN
- 프로세스 B의 통신이 끝나면 이제 연결 종료해도 괜찮다는 의미로 프로세스 A에게 FIN 플래그를 전송한다.
4. A(TIME_WAIT) -> B(LAST_ACK) : ACK
- 프로세스 A는 FIN 메시지를 확인했다는 메시지를 전송 (ACK)
- 프로세스 A로부터 ACK 메시지를 받은 프로세스 B는 소켓 연결을 해제한다.
상태 설명
CLOSE | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
ESTABLISHED | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
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로 전이한다. |
즉 이 예시의 최종 PORT 상태 : A-CLOSED, B-CLOSED(연결 해제)
참고:
https://github.com/Seogeurim/CS-study/tree/main/contents/network
'Network' 카테고리의 다른 글
DNS와 DNS round robin 방식 (2) | 2023.01.27 |
---|---|
HTTP와 HTTPS 란? + SSL 동작 과정 (20) | 2023.01.22 |
HTTP 요청 방식 - GET, POST (29) | 2023.01.18 |
TCP / UDP 차이점 (0) | 2023.01.16 |
OSI 7계층 (0) | 2023.01.06 |