목차
TCP IP란
- 인터넷에서 컴퓨터들이 서로 정보를 주고 받는데 쓰이는 프로토콜의 집합입니다.
- TCP/IP 프로토콜은 데이터를 안정적으로 전송하기 위한 연결 지향 프로토콜입니다.
- TCP/IP는 총 4가지 계층이 있습니다.
Application Layer(응용 계층)
- 특정 서비스를 제공하기 위해 어플리케이션 끼리 정보를 주고받을 수 있습니다.
- FTP, HTTP, SSH, Talnet, DNS, SMTP 프로토콜 등
- 가장 큰 예로 브라우저와 웹서버가 정보를 주고받기 위한 통신
Transport Layer(전송계층)
- 데이터의 흐름 제어, 3핸즈 셰이크, 수신 받을 정보를 저장(port 번호)
- 송신된 데이터를 수신측 애플리케이션에 확실하게 전달하게 해줍니다. ⇒ 흐름제어 및 오류 복구 기능 등 데이터의 신뢰성과 효율성 제공
- 네트워크 통신을 할때 port번호를 (기본은 80) 사용하게 되는데 이를통해 애플리케이션을 찾아줍니다.
- TCP, UDP, RTP, RTCP 프로토콜 등
Internet Layer(인터넷 계층)
- 목적지의 경로를 설정, 호스트간의 라우팅을 담당하는 계층
- 수신 측까지 데이터를 전달하기 위해 사용됩니다. ⇒ 네트워크 경로 관리
- 송신, 수신 모두 IP주소를 가지고 있어 IP주소를 통해 올바른 목적지로 찾아갈 수 있도록 해줍니다.
- 라우팅 관리
- IP, ARP OSPF 등
Network Access Layer 또는 Link Layer
- 네트워크에 직접 연결된 기기 간의 데이터 전송을 도와줍니다.
- 물리적인 Mac 주소 사용
- Ethernet, PPP, Token Ring과 같은 프로토콜 사용
TCP IP 흐름
- www.google.com을 웹 브라우저에 입력하면 어떻게 될까요?
- 사용자가 브라우저의 User Interface의 검색창에 www.google.com을 입력
- 브라우저 엔진은 서버로부터 데이터를(HTML파일) 얻기 위해 TCP/IP 프로토콜을 사용합니다.
- 우선 패킷을 만들어야 합니다.
- 패킷이란 네트워크가 전달하는 데이터의 형식화된 블록(구조체 or 레코드) ⇒ 네트워크 데이터를 주고받을 때 정해 놓은 규칙 ⇒ 정보를 보낼때 특정 형태를 맞춰어 보낸다~
- Application → transport → internet → network Access 순으로 패킷에 데이터를 담아줍니다. 예시에서는 HTTP, TCP, IP, Ethernet 사용
Application Layer
- 패킷의 Application Layer에는 HTTP request가 들어갑니다. ⇒ axios나 fetch 할때 HTTP 메소드, 요청 URL, header, body등등 그거랑 같음
Transoport Layer
- Transoport에서는 여러가지가 있지만 SourcePort, DestinationPort 즉 시작과 목적지의 포트번호(기본적으로 80)를 담아줍니다.
Internet Layer
- 여기도 여러가지가 있지만, 중요한건 SP,DP 즉 시작 IP, 목적지 IP주소가 담긴다.
- 그러나 시작 IP는 알고있지만, 목적지 IP는 모름 ⇒ 왜? www.google.com밖에 모르니까 ⇒ 응용계층에서 DNS 프로토콜을 통해 host or domain을 통해 IP주소로 변환 해서 IP주소를 알아내고, 인터넷 계층에서 패킷에 ip를 담아준다.
- DNS : 브라우저가 OS에 요청을 보냄 → OS는 DNS서버로 요청을 보냄 → DNS서버 주소는 컴퓨터에 이미 등록되어 있음 → DNS 또한 HTTP와 같은 애플리케이션 계층 프로토콜임
Network Access Layer
- Mac주소가 필요하다 MAC주소 : 네트워크의 장치의 하드웨어에 물리적으로 부여되는 주소
- 공유기를 통해 데이터 패킷을 주고받을 수 있기 때문에 구글의 MAC주소는 필요없고, 우리집 공유기의 MAC주소만 있으면 된다. 따라서 공유기를 게이트웨이 라고 함
- 게이트 웨이 라고 부르기도 함(공유기가 게이트웨이 역할을 함, 게이트 웨이는 서로다른 2개 이상의 네트워크 간 통신을 중개하는 장치 또는 시스템) 게이트웨이의 IP주소를 통해 게이트웨이의 Mac주소를 얻는다 (ARP 프로토콜)
- ⇒ 왜? 게이트웨이를 통해 구글 서버와 데이터를 교환할 수 있기 때문
요약
- www.google.com을 검색창에 입력
- 브라우저 엔진이 서버에 TCP/IP 프로토콜을 사용해서 html파일을 요청
- TCP/IP는
3-1. 응용계층에서 HTTP 요청 정보를 패킷에 담는다.
3-2. 전송계층에서 소스Port, 목적지 Port정보를 패킷에 담는다.
3-3. 인터넷 계층에서 소스Ip , 목적지 IP를 담는다. 이때 목적지 Ip는 응용계층에서 DNS를 통해 도메인을 Ip로 변환한 값을 인터넷 계층에서 패킷에 저장
3-4. 네트워크 access 계층에서 수신자인 사용자의 Mac주소와, 수신자가 사용하는 게이트웨이 역할을 하는 공유기의 IP주소로 ARP를 통해 얻은 Mac주소를 패킷에 담는다.
TCP 요청 작업 끝 (패킷 작성 완료)
- TCP는 연결지향형 프로토콜, 신뢰할 수 있는 프로토콜
- 신뢰할수 있는 프로토콜? ⇒ 요즘은 데이터가 너무 커서 여러가지 패킷을 보낸다→ 또한 엄청나게 복잡한 인터넷을 통해 목적지로 이동(우리집에서 구글까지 간다고? 가다가 잃어버리는거 아니야? ⇒ 훌륭한 TCP는 흐름제어, 오류제어, 혼잡제어를 통해 신뢰성 있는 데이터 전송을 보장)
- 그런데 TCP는 연결 지향형 이므로 송신측과 수신측이 연결되는 작업이 필요 => 이 연결작업을 3 way handlshaking이라고 함
- URG, ACK, PSH, RST, SYN, FIN등 TCP header에 다양한 플래그가 존재함 ⇒ 플래그들을 컨트롤비트 라고 함
- 그중에서 SYN, ACK 플래그가 사용됨
- SYN : 클라이언트가 서버에게 접속을 요청하는 SYN패킷을 보냄
- 서버는 SYN 요청을 받아 클라이언트에게 요청을 수락한다는 ACK, SYN 플래그가 설정된 패킷을 보냄
- 클라이언트는 서버에게 다시 ACK를 보냄 ⇒ 연결완료
3 handsShaking 요약
URG, ACK 등 컨트롤 비트 중 SYN, ACK 플래그를 사용
1. 클라이언트는 서버에게 SYN 플래그를 보냄 -> 1단계
2. 서버는 SYN을 받아 요청을 수락한다는 의미로 ACK, SYN을 보냄-> 2단계
3. 클라이언트는 다시 서버에게 ACK를 보냄 -> 3단계
- 공유기를 통해 라우팅을 통해 구글 서버를 찾으러 출발. 이때 NAT작업을 진행
- NAT(Network Address Translation) : 내 컴퓨터는 private IP주소를 가지고, 공유기를 통해 Public IP로 변환하여 나가는 작업
- 우리집 공유기를 거쳐서 구글 서버로 가는데 여러 라우터를 거쳐야함
- 라우터 : 네트워크와 네트워크를 연결해주는 역할
- 라우팅 : 라우터가 목적지까지 찾아나가는 과정
- 연결이 완료되면 인터넷 계층과 network Access 계층에 저장되어 있던 Ip, Mac주소를 통해 목적지인 구글 서버로 데이터패킷이 도착합니다.
- 웹서버는 패킷을 확인하여 Transport Layer에서 작성해둔 포트번호를 확인하여 어떤 어플래케이션으로 응답할지를 결정
- 또한 웹 서버가 사용될 HTTP Requeset 데이터를 얻을 수 있게 됩니다.
- 이후 ‘/’에 매핑된 get 요청을 처리해서 적절한 HTML을 응답해준다.
- HTTP 요청과 응답과정이 끝나면 연결을 종료해야한다. 이때도 TCP 컨트롤 비트가 사용됨
- 이단계에서는 ACK, FIN 플래그가 사용
- 4-way-handshaking이라고 부름
- 클라이언트가 서버로 연결을 종료하겠다는 FIN 플래그를 전송
- 서버는 ACK 메세지를 보내고 자신의 통신이 끝날 때 까지 기다림
- 서버가 통신이 끝나면 클라이언트로 FIN을 보냄
- 클라이언트는 확인했다는 의미로 서버에게 ACK를 보내면 연결 종료
- 이때 서버가 보냈던 데이터가 FIN보다 늦게 도착할 경우 문제가 발생 → 서버가 FIN을 수신해서 클라이언트가 연결된 소켓을 닫아버리면 데이터를 못받음 → 그래서 클라이언트는 FIN요청을 받아도 일정시간 소켓을 닫지 않고 잉여 패킷을 기다림(TIME_WAIT)이라고 함
최종 요약
그러면 순서대로 말해보겠습니다.
1. 사용자가 브라우저 User Interface의 검색창에 www.google.com을 검색
2. 브라우저 엔진이 서버로부터 HTML 파일을 얻기 위해 TCP/IP 프로토콜 사용
3. 사용자가 입력한 Domain을 통해 DNS가 구글 서버의 Ip값을 받아옴
4. Ip값을 통해 라우팅으로 구글 서버를 찾아내고, 3 핸즈셰이킹을 통해 연결
5. 연결된 구글 서버에 데이터를 보내기 위해 패킷을 생성
5-1 응용계층에서 HTTP 요청 정보를 패킷에 저장
5-2 전송계층에서 송,수신자의 포트번호를 패킷에 저장
5-3 인터넷 계층에서 송 수신자의 Ip값을 패킷에 저장
5-4 네트워크 엑세스 계층에서 ARP를 통해 ip로 Mac 를 알아내어 Mac주소를 패킷에 저장
6. 패킷의 Ip, Mac주소 정보를 통해 구글 서버에게 정보를 송신
7. 구글 서버는 패킷에 저장되어진 Port 번호를 확인하여 Data를 전송할 곳을 기억
8. 패킷에 저장되어있는 HTTP정보를 확인하고, HTML 파일을 7에서 기억해둔 Port에 보냄
9. HTML 파일을 브라우저에서 받아서 렌더링
참고