인터넷과 관련된 다양한 프로토콜의 집합을 의미하고 OSI 7계층을 4계층으로 단순화한 모델을 말함
TCP/IP는 TCP, IP 프로토콜이 각각 전송 계층, 인터넷 계층에서 '케이블 규격, IP 주소 지정방법, 통신 대상을 찾는 방법과 그것에 도달하기 위한 순서" 등을 제어하는 역할을 함
이렇게 계층화를 하는 이유
계층 별로 담당하는 역할을 나누어 각각의 프로토콜이 자신의 기능만 하도록 독입성을 보장하기 위해서임
즉, 어떤 계층에서 문제가 생겼을 경우 해당 계층만 파악하면 되고, 각각의 계층에 존재하는 프로토콜의 독립성을 보장하기 위해서임
TCP/IP 각 계층의 역할
- 링크 계층
- 인터넷 계층에서 형성된 패킷을 전기신호 혹은 광신호로 바꾸어 전달하는 역할
- 인터넷 계층
- IP(Internet Protocol)는 인터넷 계층에 존재함
- 링크 계층을 통해 물리적으로 연결된 호스트 사이에서 패킷의 전달 경로를 결정함
- IP는 라우팅 방법을 정의함 : 전송계층(인터넷 계층의 상위계층)이 데이터 전달의 신뢰성을 책임진다는 가정하에 어떤 경로로 패킷을 전송할 것인지에 초점을 둠
- 전송 계층
- 인터넷 계층에서 결정한 목적지까지 실제 데이터를 신뢰성있게 전송하는 역할을 함
- 전송 계층에는 TCP, UDP라는 프로토콜이 있음
- 응용 계층
- 응용 프로그램들 간의 데이터 통신이 이루어지는 계층
- ex: SMTP(메일 전송), FTP(파일 전송), HTTP(웹 접속)
TCP, UDP
1. TCP 프로토콜
- 연결 지향적 프로토콜
- 신뢰성이 보장됨(데이터 송수신을 위해 클라이언트와 서버의 소켓이 연결되어있어야 함 + 데이터가 유실되면 데이터 재전송을 요청하기 때문에 신뢰성 보장)
- 대부분의 응용 계층 프로토콜의 전송 계층으로 사용됨(신뢰성 있는 데이터 전송이 가능하기 때문에)
2. UDP 프로토콜
- 비연결 지향 프로토콜
- 데이터가 잘 전달되었는지 확인하지 않고 단지 데이터만 보냄
-> 비신뢰적이지만 속도가 빠름
- 동영상 스트리밍 같은 서비스에 적합
TCP 3-Way-Handshake
TCP 3-Way-Handshake는 TCP/IP 프로토콜을 이용해 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상태방의 컴퓨터와 사전에 세션을 수립하는 것을 말함
3-way-handshake를 통해 서로가 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달을 시작하기 전에 서로 준비되었다는 것을 알 수 있게 함
TCP 3-Way-Handshake 과정
클라이어트는 서버에 접속을 요청함(SYN라는 패킷을 보내서 서버 연결요청)
클라이언트는 SYN을 보내고 SYN/ACK응답을 기다리는 SYN_SENT상태가 됨
서버는 클라이언트에서 온 SYN을 받고 클라이언트에게 요청을 수락한다는 ACK와 클라이언트쪽에서도 포트를 열어달라는 SYN 데이터를 보내고 클라이언트가 다시 ACK로 응답하기를 기다림(이 때 서버는 SYN_RECEIVED 상태가 됨)
클라이언트는 서버가 보낸 ACK와 SYN를 받고 포트를 연 다음 이에 대한 확인으로 ACK를 서버에게 보냄 -> 클라이언트는 ESTABLISHED 상태가 됨 -> 서버도 ESTABLISHED 상태가 됨 -> 클라이언트와 서버 연결이 이루어짐 -> 데이터 주고 받고 시작됨
이 과정을 통해 신뢰성있는 통신을 확인할 수 있음
TCP 4-Way-Handshake
TCP 4-Way-Handshake는 클라이언트와 서버가 서로 연결을 종료할 때 4-way-handshake를 수행함
클라이언트가 연결을 종료하겠다는 FIN 데이터를 전송함(이 때 클라이언트는 FIN_WAIT_1상태임)
서버는 알겠다는 의미로 ACK를 보내고 어플리케이션의 소켓을 닫음
자원을 정리하는 데 시간이 걸리므로 소켓을 닫는데 기다리고 있는 상태라는 의미의 CLOSE_WAIT 상태로 변경됨
그 동안 클라이언트는 서버로부터 응답이 올 때까지 기다리고 있겠다는 FIN_WAIT_2상태가 됨
어플리케이션의 소켓을 닫으면 서버는 클라이언트로 FIN 데이터를 보냄
이 때 서버는 클라이언트로부터 마지막 ACK를 기다리고 있는 LAST_ACK 상태가 됨
클라이언트는 FIN 데이터를 받으면 TIME_WAIT 상태로 바꾸면서 서버에 ACK 데이터를 보냄
이 때 클라이언트는 TIME_WAIT 상태에서 일정 시간이 되면 CLOSED 상태가 됨
TIME_WAIT 상태를 일정 시간동안 가지는 이유
만약 서버에서 FIN을 전송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송등으로 인해 FIN보다 늦게 도착한다면 어떻게 될까? -> 클라이언트쪽 세션을 종료시킨 후에 뒤늦게 도착하는 패킷이 있다면 이 패킷은 유실될 것임(연결이 종료되었으니까)
이러한 상황에 대비해 클라이언트는 서버로부터 FIN을 수신받더라고 일정시간(default: 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치는데 이 과정을 TIME_WAIT라고 함
TCP 3-Way-Handshake, 4-Way-Handshake
TCP/IP 4계층
이렇게 계층화를 하는 이유 계층 별로 담당하는 역할을 나누어 각각의 프로토콜이 자신의 기능만 하도록 독입성을 보장하기 위해서임 즉, 어떤 계층에서 문제가 생겼을 경우 해당 계층만 파악하면 되고, 각각의 계층에 존재하는 프로토콜의 독립성을 보장하기 위해서임
TCP/IP 각 계층의 역할
- 링크 계층 - 인터넷 계층에서 형성된 패킷을 전기신호 혹은 광신호로 바꾸어 전달하는 역할 - 인터넷 계층 - IP(Internet Protocol)는 인터넷 계층에 존재함 - 링크 계층을 통해 물리적으로 연결된 호스트 사이에서 패킷의 전달 경로를 결정함 - IP는 라우팅 방법을 정의함 : 전송계층(인터넷 계층의 상위계층)이 데이터 전달의 신뢰성을 책임진다는 가정하에 어떤 경로로 패킷을 전송할 것인지에 초점을 둠 - 전송 계층 - 인터넷 계층에서 결정한 목적지까지 실제 데이터를 신뢰성있게 전송하는 역할을 함 - 전송 계층에는 TCP, UDP라는 프로토콜이 있음 - 응용 계층 - 응용 프로그램들 간의 데이터 통신이 이루어지는 계층 - ex: SMTP(메일 전송), FTP(파일 전송), HTTP(웹 접속)TCP, UDP
1. TCP 프로토콜 - 연결 지향적 프로토콜 - 신뢰성이 보장됨(데이터 송수신을 위해 클라이언트와 서버의 소켓이 연결되어있어야 함 + 데이터가 유실되면 데이터 재전송을 요청하기 때문에 신뢰성 보장) - 대부분의 응용 계층 프로토콜의 전송 계층으로 사용됨(신뢰성 있는 데이터 전송이 가능하기 때문에) 2. UDP 프로토콜 - 비연결 지향 프로토콜 - 데이터가 잘 전달되었는지 확인하지 않고 단지 데이터만 보냄 -> 비신뢰적이지만 속도가 빠름 - 동영상 스트리밍 같은 서비스에 적합TCP 3-Way-Handshake
TCP 3-Way-Handshake 과정
클라이어트는 서버에 접속을 요청함(SYN라는 패킷을 보내서 서버 연결요청) 클라이언트는 SYN을 보내고 SYN/ACK응답을 기다리는 SYN_SENT상태가 됨
서버는 클라이언트에서 온 SYN을 받고 클라이언트에게 요청을 수락한다는 ACK와 클라이언트쪽에서도 포트를 열어달라는 SYN 데이터를 보내고 클라이언트가 다시 ACK로 응답하기를 기다림(이 때 서버는 SYN_RECEIVED 상태가 됨)
클라이언트는 서버가 보낸 ACK와 SYN를 받고 포트를 연 다음 이에 대한 확인으로 ACK를 서버에게 보냄 -> 클라이언트는 ESTABLISHED 상태가 됨 -> 서버도 ESTABLISHED 상태가 됨 -> 클라이언트와 서버 연결이 이루어짐 -> 데이터 주고 받고 시작됨
이 과정을 통해 신뢰성있는 통신을 확인할 수 있음
TCP 4-Way-Handshake
TCP 4-Way-Handshake는 클라이언트와 서버가 서로 연결을 종료할 때 4-way-handshake를 수행함
TIME_WAIT 상태를 일정 시간동안 가지는 이유 만약 서버에서 FIN을 전송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송등으로 인해 FIN보다 늦게 도착한다면 어떻게 될까? -> 클라이언트쪽 세션을 종료시킨 후에 뒤늦게 도착하는 패킷이 있다면 이 패킷은 유실될 것임(연결이 종료되었으니까) 이러한 상황에 대비해 클라이언트는 서버로부터 FIN을 수신받더라고 일정시간(default: 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치는데 이 과정을 TIME_WAIT라고 함