민프
[TCP] TCP란 무엇일까? (feat. OSI 7계층) 본문
TCP는 OSI 7계층들 중 TCP/IP의 전송 계층에서 사용되는 프로토콜이다.
같은 계층에 UDP라는 것이 있는데 이 UDP가 무엇인지, TCP와의 차이점은 무엇인지에 대해서 나중에 다뤄보도록 해보자
TCP란 무엇일까?
네이버 IT용어사전에 의하면
https://terms.naver.com/entry.naver?docId=2271913&cid=51207&categoryId=51207
TCP(Transmission Control Protocol)는 IP 프로토콜 위에서 연결형 서비스를 지원하는 전송계층 프로토콜로, 인터넷 환경에서 기본으로 사용한다
이라고 나와있다. 연결형 서비스? 음 왜 연결형 서비스가 필요해서 이 TCP가 만들어진걸까? 만들어진 이유를 좀 알아봐야겠다.
TCP의 기원이 어떻게 되는걸까?
위키백과에 의하면
1974년 5월 전기 전자 기술자 협회(IEEE)는 “A Protocol for Packet Network Intercommunication.”라는 제목의 논문을 발표했고, 이 모델의 핵심 제어 요소는 연결 지향 링크(connection-oriented links)와 호스트 간의 데이터그램 서비스를 모두 포함하는 전송 제어 프로그램(Transmission Control Program) 이라고 하였다.
즉, TCP는 연결 지향적 인 것을 중점으로 만들어진 프로토콜 이라는 것을 알 수 있다.
(여기에서 연결 지향적 프로토콜은 클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜을 의미한다.)
TCP의 특징
- 연결형 서비스로 연결이 성공해야 통신이 가능하다.
- 세그먼트에 순번을 지정하여 데이터의 순서를 유지한다.
- 3-Way Handshake을 통해 연결하고 4-Way Handshake을 통해 연결을 종료한다.
- 전이중(Full-Duplex), 점대점(Point to Point) 서비스 ...
위 특징들이 있는데 3-Way Handshake, 4-Way Handshake이란 무엇일까? 일단 Handshake 부터 알아보자
Handshake 은 '악수'란 뜻으로 IT용어로는 '주고받기'라고 쓰이고 있다.
IT용어 해석으로는 두 개의 실체 간에 확립된 통신 채널의 변수를 동적으로 설정하는 자동화된 협상 과정이라고 나와있는데
쉽게 말해서 양쪽 모두 데이터를 전송할 준비가 되어있다는 것을 보장한다는 것이다.
TCP 프로토콜의 작동은 크게 세 가지 흐름으로 구분된다.
- 연결 생성 (Connection establishment) - 3-way-handshaking
- 자료 전송 (Data transfer)
- 연결 종료 (Connection termination) - 4-way-handshaking
신뢰성 있는 연결이 생성되어야 하며, 그 후 자료를 전송하고, 마지막으로 연결을 종료하면서 할당된 자원을 반납한다.
그럼 정상적으로 TCP연결이 생성 될 때 3-Way Handshake가 동작하는 과정을 알아보자
3-Way Handshake 동작과정
- SYN(synchronize sequence numbers): 클라이언트가 서버에게 SYN 메시지를 보낸다. 이 메시지에 포함된 시퀀스 번호는 클라이언트가 임의로 설정한 값 A.
(클라이언트 : SYN-SENT 상태, 서버 : SYN-RECEIVED 상태) - SYN-ACK(synchronize sequence numbers - acknowledgment): 서버가 클라이언트에게 SYN-ACK 메시지로 응답한다. 이 메시지에 포함된 시퀀스 번호는 서버가 임의로 설정한 값 B, 응답 번호는 (A + 1)
(클라이언트 : ESTABLISHED 상태, 서버 : SYN-RECEIVED 상태) - ACK(acknowledgment): 클라이언트가 서버에게 ACK 메시지를 보낸다. 이 메시지에 포함된 응답 번호는 (B + 1).
(클라이언트 : ESTABLISHED 상태, 서버 : ESTABLISHED 상태)
이렇게 위 3-way Handshake으로 연결을 맺는다.
그럼 연결 해제할 때 사용되는 4-way Handshake는 뭘까?
4-way Handshake 동작과정
위 블로그에서 잘 설명하고 있는 그림이 있는 것 같아서 가져와봤다.
- FIN : 클라이언트가 서버에게 연결을 종료하겠다는 FIN 플래그를 전송한다.
(클라이언트 : FIN_WAIT_1 상태) - ACK : FIN 플래그를 받은 Server는 확인메세지인 ACK를 Client에게 보내준다. 그 후 CLOSE-WAIT상태로 변한다. Client도 마찬가지로 Server에서 종료될 준비가 됐다는 FIN을 받기위해 FIN-WAIT-2 상태가 된다.
(클라이언트 : FIN-WAIT-2 상태, 서버 : CLOSE-WAIT) - FIN : Close준비가 다 된 후 Server는 Client에게 FIN 플래그를 전송한다.
(서버 : LAST-ACK 상태) - ACK : Client는 해지 준비가 되었다는 정상응답인 ACK를 Server에게 보내준다. 이 때, Client는 TIME-WAIT 상태로 변경된다.
여기서 TIME-WAIT 상태는 의도치않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 변경 되는 것인데, 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 변경된다.
(클라이언트 : TIME-WAIT 상태, 서버 : CLOSED)
이렇게 TCP가 어떻게 연결이 되고, 해제가 되는지 알아보았다.
참고 링크
https://ko.wikipedia.org/wiki/%ED%95%B8%EB%93%9C%EC%85%B0%EC%9D%B4%ED%82%B9
https://jeongkyun-it.tistory.com/180
https://datatracker.ietf.org/doc/html/rfc793#page-30
'[네트워크]' 카테고리의 다른 글
[네트워크] DeepLink란? (feat. App Link, Universal Links, Dynamic Links) (0) | 2024.03.13 |
---|---|
[STOMP] STOMP란 무엇일까? (0) | 2023.08.03 |
[WebSocket] WebSocket이란 무엇일까? (0) | 2023.08.03 |
[WebSocket] 업비트 웹소켓(webSocket)과 통신해보자 (feat. blob 데이터) (0) | 2023.04.03 |