<h1><center> TCP/IP 4계층 </center></h1> ###### tags: `💻 TIL`, `Computer Science`, `TCP/IP 4계층`, `OSI 7계층`, `Network` ###### date: `2024-02-01T15:12:33.284Z` > [color=#724cd1][name=데릭] > [TCP/IP 4계층 - 진짜 정리 잘되있음](https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-TCP-IP-%EC%A0%95%EB%A6%AC-%F0%9F%91%AB%F0%9F%8F%BD-TCP-IP-4%EA%B3%84%EC%B8%B5) > [OSI 7계층과 TCP/IP 4계층을 비교 설명](https://www.nossi.dev/06936fc0-eb03-4a53-8e4f-2e5dc71508dd) > [TCP - 위키백과](https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C) # 개요 > OSI 7계층과 같이 꼭 알아야 할 개념이다. ## IP(Internet Protocol) > 지정한 IP 주소에 데이터의 조각들을 패킷이라는 통신 단위로 최대한 빨리 목적지로 보내는 역할. 즉, 패킷 전달을 담당하는 것이다. 인터넷에서 데이터를 송수신하기 위한 주소 체계와 라우팅을 지원한다. IP는 주로 네트워크 계층에서 작동한다. 조각들의 순서가 뒤바뀌거나 일부가 누락되더라도 크게 상관하지 않고 보내는 데 집중한다고 함. 그래서 IP는 패킷의 순서를 보장할 수 없고 패킷이 중간에 유실되도 방안이 없음. ## TCP(Transmission Control Protocol) TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일연의 옥텟을 안정적으로, 순서대로, 에러없이 교환할 수 있다. TCP는 전송 계층에 위치한다. - 패킷 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. - 도착한 조각을 점검하여 줄을 세우고 망가졌거나 빠진 조각을 다시 요청하는 식으로 순서를 보증한다. - TCP는 데이터를 상대에게 확실하게 보내기 위해 **3 way handshake**라는 방법을 사용하고 있다. - 여기에서 고유의 `SYN`와 `ACK`라는 TCP 플래그를 사용한다. - TCP는 IP의 문제를 보완해주는 것이다. ![스크린샷 2024-02-02 09.32.03](https://hackmd.io/_uploads/SyGzu2t5T.png) **NOTE** > **3 way handshake**: 본격적으로 상대 클라이언트와 연결되기 전에 가상 연결을 해서 패킷으로 보내 확인하는 동작을 말한다. <br> > SYN: 접속 요청을 의미한다. 연결을 생성할 때 클라이언트가 서버에 시퀀스 번호를 보내는 패킷이다. <br> > ACK: 요청 수락의 의미이다. ACK 값을 사용하여 응답하는 패킷이다. > SYN-ACK: 시퀀스 번호를 받은 서버가 ACK 값을 생성하여 클라이언트에게 응답하는 패킷이다. ![스크린샷 2024-02-02 10.04.08](https://hackmd.io/_uploads/BJX916Y56.png) 1. 클라이언트 -> 서버: SYN 패킷을 전송한다. 2. 서버 -> 클라이언트: SYN-ACK패킷을 전송한다. 3. 클라이언트 -> 서버: (ACK + 데이터) 패킷을 전송한다. 4. 데이터 패킷 전송 ### TCP가 순서를 보장하는 방법 ![스크린샷 2024-02-02 10.06.53](https://hackmd.io/_uploads/rJF4gaYqT.png) 1. 클라이언트에게 패킷 1, 패킷 2, 패킷 3 순서로 전송한다. 2. 서버에서 패킷 1, 패킷 3, 패킷 2 받았을 떄 3. 서버에서 패킷 2번부터 다시 보내라고 클라이언트에게 요청하는 방식으로 순서를 보장한다. (TCP 기본 동작방식) => 이렇게 패킷을 순서대로 제어를 할 수 있는 이유는 TCP 데이터 안에 전송 제어, 순서, 정보들이 있기 때문이라고 한다. 그래서 TCP가 신뢰할 수 있는 프로토콜이다. ## UDP(User Datagram Protocol) UDP는 전송 계층에서 동작하는 프로토콜로, 데이터그램을 사용하여 데이터를 전송한다. UDP는 TCP와 비교되는 프로토콜로서, 연결 지향적이지 않고 오류 복구 매너지즘이 없다. 하지만, 그 대신 빠른 데이터 전송을 지향한다. UDP 패킷은 IP 패킷 내에 포함될 수 있다. - IP와 거의 비슷하다. PORT와 체크섬(메시지를 검증해주는 데이터) 정도만 추가된 형태이다. - IP에 기능이 거의 추가되지 않은 백지상태이기 때문에 최적화 및 커스터마이징이 용이하다. ## TCP vs UDP 1. 연결 지향성(Connection-oriented) vs 비연결 지향성(Connectionless) - TCP: 연결 지향적인 프로토콜로 통신 시작 전에 세션을 수립하고 종료할 떄까지 연결을 유지한다. 신뢰성이 높고 순서대로 데이터를 전송하며, 오류 발생 시 재전송을 시도한다. - UDP: 비연결 지향적인 프로토콜로, 통신에 미리 정의된 연결을 설정하지 않는다. 각 패킷은 독립적으로 처리되며, 순서와 신뢰성을 보장하지 않는다. 2. 신뢰성(Reliability) - TCP: 신뢰성이 높다. 데이터 손실을 최소화하기 위해 재전송 및 흐름 제어 메커니즘이 있다. - UDP: 신뢰성이 낮다. 오류가 발생하면 재전송이나 복구 매커니즘이 없어, Application에서 직접 처리해야 한다. 3. 순서보장(Ordering) - TCP: 데이터를 전송한 순서대로 수신측에 전달한다. - UDP: 데이터가 전송된 순서와 상관없이 수신된다. 4. 흐름 제어(Flow Control) 및 혼잡 제어(Congestion Control) - TCP: 흐름 제어 및 혼잡 제어 기능이 내장되어 있어, 네트워크의 혼잡을 관리하고 효율적으로 대역폭을 사용한다. - UDP: 이러한 매커니즘이 없으므로, 전체 대역폭을 사용하며 혼잡을 관리하지 않는다. 5. 헤더 크기 - TCP: 헤더 크기가 크며, 연결 설정과 관련된 추가적인 정보를 포함한다. - UDP: 헤더 크기가 작고, 간단한 정보만을 포함한다. 6. 사용 사례 - TCP: 파일 전송, 이메일 전송, 웹 브라우징과 같이 신뢰성이 중요한 Application에서 주로 사용된다. - UDP: 실시간 스트리밍, 음성 통화, 온라인 게임과 같이 신속한 전송이 중요한 Application에서 주로 사용된다. ![스크린샷 2024-02-02 11.17.17](https://hackmd.io/_uploads/S1yal0Ycp.png) ![스크린샷 2024-02-02 10.09.02](https://hackmd.io/_uploads/r1theatqp.png) ## TCP/IP 4계층 ![스크린샷 2024-02-02 11.19.25](https://hackmd.io/_uploads/SkuVbCtcp.png) - **1계층 - Network Interface - Ethernet** - **2계층 - Internet - IP** - **3계층 - Trnsport - TCP, UDP** - **4계층 - Application - HTTP, FTP, DNS, SMTP** ### Network Layer > 이 계층은 NodeToNode간의 신뢰성 있는 데이터 전송을 담당하는 계층이다. OSI 7계층의 물리 계층과 데이터 링크 계층의 역할을 담당한다. 알맞은 하드웨어로 데이터가 전달되도록 MAC주소를 핸들링 하는 것뿐만 아니라, 데이터 패킷을 전기 신호로 변환하여 선로를 통해 전달할 수 있게 준비함. - OSI 7계층에서 데이터 링크 계층이 MAC주소를 핸들링함. ![스크린샷 2024-02-02 11.22.29](https://hackmd.io/_uploads/Hk-xzAFcT.png) ### Internet Layer > IP를 담당하는 계층으로 IP를 사용해 데이터의 Origin과 Destination에 관한 정보를 첨부한다. 복잡한 네트워크 망을 통해 가장 효율적인 방법으로 데이터의 작은 조각들을 되도록 빨리 내보내는 일을 한다. 따라서 IP는 패킷 전달 여부를 보증하지 않고, 경로를 설정하여 어떻게든 빨리 보냄. - IP: 비연결 서비스를 제공하며, 발신지와 목적지까지의 라우팅 경로를 결정한다. - ICMP: IP제어와 메시지 기능을 담당한다. - ARP:IP주소를 이용해 상대방의 MAC주소를 알아오는 프로토콜이다.(브로드캐스트 요청, 유니캐스트 응답) - RARP: MAC주소에 해당하는 IP주소를 알아오는 프로토콜이다. (브로드캐스트 요청, 유니캐스트 응답) ### Transport Layer > TCP / UDP를 담당하는 계층이다. TCP는 IP 위에서 동작하는 프로토콜로 데이터의 전달을 보증하고 보낸 순서대로 받게해준다. 즉, 순서가 맞지 않거나 중간에 빠진 부분을 점검하여 다시 요청하는 일을 담당한다. ### Application Layer > HTTP / FTP를 담당하는 계층이다. OSI 7계층의 5계층(세션, 표현, 응용 계층)의 기능을 담당한다. 서버나 클라이언트 응용 프로그램이 이 계층에서 동작한다. 우리가 알고 잇는 브라우저나 텔넷같은 서비스가 이 계층에서 동작한다고 할 수 있다. - DNS(Domain Name System): 인터넷에서 사용하는 이름을 해당 IP주소로 변환해주는 시스템이다. - SNMP(Simple Network Mangement Protocol): 네트워크 장비를 모니터링하고 제어하는 프로토콜이다. - FTP(File Transfer Protocol): TCP환경에서의 파일 전송 프로토콜이다. - TFTP(Trival File Transfer Protocol): UDP환경에서의 파일 전송 프로토콜이다. - HTTP(Hypertext Transfer Protocol): 웹상에서 정보를 주고받을 수 있는 프로토콜이다. ## TCP/IP 4계층 동작 순서 ![스크린샷 2024-02-02 11.32.33](https://hackmd.io/_uploads/S1hBVAFcT.png) 1. 송신측 클라이언트의 `애플리케이션 계층`에서 어느 웹 페이지를 보고 싶다라는 HTTP Request를 지시한다. 2. 그 다음에 있는 `트랜스포트 계층`에서는 애플리케이션 계층에서 받은 데이터(HTTP message)를 통신하기 쉽게 조각내어 안내 번호와 Port 번호(TCP 패킷)를 붙여 네트워크 계층에 전달한다. 3. 네트워크 계층에서 데이터에 IP 패킷을 추가해서 링크 계층에 전달한다. 4. 링크 계층에서는 수신지 MAC 주소와 이더넷 프레임을 추가한다. 5. 네트워크를 송신할 준비완료. 6. 수신측 서버는 링크 계층에서 데이터를 받아들여 순서대로 위의 계층으로 전달하여 애플리케이션 계층까지 도달한다. 7. 수신측 애플리케이션 계층에 도달하게 되면, 클라이언트가 발신했던 HTTP Request를 수신할 수 있게 된다. **NOTE** > OSI 7계층은 이론적이고 TCP/IP를 더 많이 활용한다. ### 웹 사이트 접속 시나리오 1. 웹 브라우저에 `www.google.com`을 입력한다. 2. DNS(Domain name system)로 구글의 서버 IP주소를 할당한다. 3. 응용 계층(Lv4)에서 메시지 데이터 패킹(HTTP Message) 4. 전송 계층(Lv3)에서 PORT정보(출발지, 목적지), 전송제어 정보, 순서 정보, 검증 정보 패킹(TCP) 5. 인터넷 계층(Lv2)에서 IP정보(출발지, 목적지)패킹 6. 네트워크 액세스(Lv1) 계층에서 MAC주소 패킹 7. 게이트웨이를 통해 인터넷망에 접속한다. 8. 라우터를 통해 목적지(구글 서버)를 찾아 연결한다. 9. 구글 서버에 도착하면 패킷을 하나씩 까면서 목적 포트에 메시지 데이터를 전달하여 다시 응답한다. ## OSI 7계층과 TCP/IP 4계층 차이점 OSI 7계층과 TCP/IP 4계층 모델에서 각 계층은 하위 계층의 기능을 이용해 상위 계층에게 기능을 제공한다. 예를 들어, HTTP는 TCP와 IP를 이용해 작동한다. 일반적으로 상위 계층의 프로토콜은 Software, 하위 계층의 프로토콜은 Hardware로 구현된다. ![스크린샷 2024-02-02 12.11.43](https://hackmd.io/_uploads/SJF_T0Yca.png) ### 캡슐화(Encapsulation) vs 역캡슐화(Decapsulation) > **캡슐화**: 통신 프로토콜의 특성을 포함하나 정보를 Header에 포함시켜서 하위 계층에 전송하는 것을 말한다.<br> > **역캡슐화**: 통신 상대측에서 Header를 역순으로 제거하면서 원래의 Data를 얻는 과정을 말한다. 예를 들어, 사용자는 응용계층(Lv7 or 4)에서 인터넷 접속(HTTP), 메일 전송(SMTP), 파일 전송(FTP), 원격 로그인(Telnet) 등의 작업을 수행한다. ![스크린샷 2024-02-02 12.15.14](https://hackmd.io/_uploads/Sk3SACF5T.png) 사용자가 전송하고자 하는 데이터는 각 프로토콜의 정보를 Header에 포함시켜서 하위 계층에 전달하고(Encapsulation), 최종적으로 물리 계층에서 Binary 데이터로 변환되어 전송된다. 상대측에서는 이러한 Header를 역순으로 하나씩 제거하면서상위 계층으로 데이터를 전달하고(Decapsulation), 최종적으로 원본 데이터를 수신한다.