정의
흔히 TCP/IP라고 알려진 인터넷 프로토콜 스위트 (Internet Protocol Suite)는 인터넷과 이와 유사한 컴퓨터 네트워크 사이에서 정보를 주고받는 데 이용되는 통신 프로토콜의 모음이다.
IP는 데이터의 조각들을 최대한 빨리 목적지로 보내는 역할을 한다.
조각들의 순서가 뒤바뀌거나 일부가 누락되더라도 보내는데 집중을 하고
TCP는 IP보다 느리지만 꼼꼼한 방식을 사용하여 도착한 조각을 점검하고 줄을 세워 망가졌거나 빠진 조각을 다시 요청한다.
두 방식을 조합하여 인터넷 데이터 통신을 하는 것을 TCP/IP라고 부른다.
TCP(Transmission Control Protocol) - 전송제어 프로토콜
- 신뢰성 있는 데이터 전송을 제공하는 프로토콜이다.
- 데이터의 손실이나 손상을 감지하고 복구할 수 있다.
- 데이터를 작은 단위로 나누고, 각 단위에 일련번호를 부여하여 보낸 후, 수신 측에서 이를 재조립한다.
- 데이터의 흐름 제어와 혼잡 제어 기능을 제공하여 네트워크의 혼잡을 방지하고 효율적인 전송을 도모한다.
IP(Internet Protocol) - 인터넷 프로토콜
- 패킷 스위칭 네트워크에서 데이터 패킷의 라우팅과 전달을 담당하는 프로토콜이다.
- IP는 각각의 컴퓨터나 장치에 고유한 IP 주소를 할당하여 통신한다.
- 패킷을 목적지로 전달하기 위해 최적의 경로를 선택한다.
- 패킷을 여러 개로 나누어 전송하거나 조립하는 역할도 수행한다.
즉, TCP/IP는 인터넷 프로토콜 스위트의 핵심 프로토콜로, 신뢰성 있는 데이터 전송과 패킷의 라우팅을 담당하고,
인터넷을 비롯한 다양한 네트워크에서 사용되며, 안정적이고 효율적인 데이터 통신을 가능하게 한다.
현재 TCP/IP는 OSI 7 계층보다 더욱 널리 사용되고 있는데 그 이유는 아래와 같다.
요약하자면, TCP/IP는 OSI 7 계층 모델보다 간편한 구조, 인터넷 표준 프로토콜, 더 쉬운 네트워크 관리, 널리 알려진 애플리케이션 및 서비스 지원, 그리고 인터넷과 함께 성장한 역사 때문에 더 널리 사용된다.
TCP/IP의 4개 계층과 각 계층의 역할에 대한 설명이다.
server에서 포트는 litsen 상태이고 client에서는 closed 상태이다.
클라이언트에서 서버에 연결 요청을 하기 위해 SYN을 보낸다.
서버의 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV 상태로 변경된다.
이후 정상적으로 받았다는 대답으로 SYN + ACK를 보낸다.
클라이언트에서는 SYN + ACK를 받고 ESTABLISHED 상태로 변경되고, 그 응답으로 ACK를 보낸다.
이후 ACK를 받은 서버는 ESTABLISHED 상태로 변경된다.
이 3단계를 정상적으로 마치면, 서로 ESTABLISHED 되면서 연결이 성립된다.
STATE
CLOSED : 연결이 되어있지 않음을 나타내는 상태
LISTEN : 원격 TCP application으로부터 연결 요청을 기다리고 있는 상태
SYN_SENT : SYN(연결 요청)을 보낸 후 ACK(응답)을 기다리고 있는 상태
3 way handshake의 첫 번째 단계 후의 결과이다.
SYN_RCV : 연결 요청을 받은 후 ACK를 보낸 후이며, 최종 ACK를 기다리고 있는 상태
3 way handshake의 두 번째 단계 후의 결과이다.
ESTABLISHED : 완전히 연결이 성립되었음을 나타내는 상태
데이터 전송 단계에 대한 정상적인 상태를 나타낸다.
TCP 연결 종료는 서로 ESTABLISHED 즉, 연결이 성립된 상태에서 시작한다.
통신을 종료하고자 하는 클라이언트가 서버에게 FIN을 보낸 후, FIN_WAIT 1 상태로 대기한다.
FIN을 받은 서버는 상태를 CLOSE_WAIT로 변경하고, 응답으로 ACK를 보낸다.
해당 ACK를 받은 클라이언트는 상태를 FIN_WAIT 2로 변경한다.
이와 동시에 서버는 해당 포트에 연결되어 있는 애플리케이션에게 CLOSE()를 요청한다.
CLOSE() 요청을 받은 애플리케이션은 종료 프로세스를 통해 최종적으로 close 되고 서버는 FIN을 클라이언트에게 보낸 후 상태를 LAST_ACK로 변경한다.
FIN_WAIT 2 상태에서 서버로부터 FIN을 받으면 이에 대한 응답으로 ACK를 보낸 후 상태를 TIME_WAIT로 변경한다.
최종 ACK를 받은 서버는 CLOSED로 상태를 변경하고, 클라이언트도 일정 시간이 지나면 CLOSED로 상태를 변경한다.
STATE
FIN_WAIT_1 : 연결 종료 요청에 대한 응답(ACK)을 기다리고 있는 상태
FIN_WAIT_2 : 연결을 종료했다는 FIN(애플리케이션 종료)을 기다리고 있는 상태
FIN을 받지 못했다면 서버에서 CLOSE()를 처리하지 못한 경우일 수도 있으며, 이 경우
FIN_WAIT 상태가 계속해서 지속될 수 있다.
CLOSE_WAIT : 연결 종료 요청을 받았으며, 로컬 애플리케이션의 종료(CLOSE())를 기다리고 있는 상태
LAST_ACK : 연결 종료 요청을 보냈으며 이에 대한 응답(ACK)을 기다리고 있는 상태
주로 서버에서 로컬 애플리케이션이 종료가 되고 클라이언트로 종료 요청을 보낸 후의 상태이다.
TIME_WAIT : FIN에 대한 ACK를 보낸 후, 이를 원격지에서 받기까지 충분한 시간을 기다리고 있는 상태
일정 시간이 지나면 CLOSED 상태로 변경한다.
참고 : https://skstp35.tistory.com/250
참고 : https://velog.io/@dyunge_100/Network-TCPIP-4%EA%B3%84%EC%B8%B5%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC