본문 바로가기

CS/Computer Network

[네트워크] Ch2.1 네트워크 어플리케이션의 원리(Principles of network applications)

 

본 글은 학교 네트워크 수업을 들으며, "Computer Networking: A Top-Down Approach 8ed(컴퓨터 네트워킹: 하향식 접근 제8판)"을 기반으로 공부한 내용을 정리한 글입니다.

 

Ch2.1 네트워크 어플리케이션의 원리(Principles of network applications)


Application Layer Overview

- 가장 high level의 레이어로, end system에서 작동하며, 네트워크 위에서 통신함.

- 중요한 건, 어차피 IP가 아래서 다 연결해 줄거니까, app.에서는 app. 관련된 것만 신경쓰면 됨.

우리가 하위 계층까지 다 고려해가며 프로그램을 짤 필요가 없다는 말.

게다가, app.는 end system에서만 작동하기에, 라우터나 스위치 같은 network core devices에서 돌아갈 코드까지 짤 필요도, 짤 수도 없음.

 

캡슐화와 소켓

소켓

- 호스트의 어플리케이션 레이어와 전송 레이어 사이의 인터페이스.
- `프로세스와 네트워크 사이의 API`라고도 함.

- 네트워크 어플리케이션 프로그램이 실행되면 프로세스가 됨(당연)


캡슐화

- 리눅스 커널에는 c언어로 정의된 구조체 `sk_buff`가 있는데, 이는 그 자체로 패킷을 나타냄.

- 그래서, 해당 구조체 안의 특정 변수 값들을 읽으면, 패킷의 헤더나 데이터 정보를 알 수 있는거나 마찬가지.

- 각 변수들은 포인터로서 패킷의 정보가 있는 메모리 위치를 가리킴.

- 위와 같은 대응 관계를 이룬다.

 

- 만약 `sk_buff를 안 쓴다면`, TCP/UDP 헤더와 IP 헤더를 패킷이 주렁주렁 달고 다녀야 하는데,

- `sk_buff를 씀으로서` 안에 가볍게 포인터 변수들만 가지고도 헤더 및 데이터 정보들을 들고다닐 수 있음.

 


Client-Server and Peer-to-Peer Models

세상엔 수많은 어플리케이션들이 있음. 이메일, 웹, 검색, SNS, ...

이러한 어플리케이션들이 가지는 대표적인 어플리케이션 구조는 아래 2가지가 있음.

 

Client-to-Server(CS) 구조

서버

- `항상 켜져있음`

- `고정적인 IP 주소를 가짐`

- 데이터 센터를 여러개 둬서 트래픽을 분산시킴

클라이언트

- 서버와 통신함

- `간혈적으로 연결될 수 있음` - 통신 연결과 해제가 자유로움.

- `동적인 IP 주소를 가짐` - 고정될 필요가 x.

 

Peer-to-Peer(P2P) 구조

- 항상 켜져있을 필요가 없는 서버

- 각 end system들은 직접적으로 통신할 수 있음

- `각 peer들은 동시에 서버가 될수도, 클라이언트가 될 수도 있음.`

- 간혈적으로 연결될 수 있음.

- 동적인 IP 주소를 가짐

- 관리하기가 복잡함

- 이론적으로 peer가 많아질수록 통신 효율이 기하급수적으로 좋아짐

=> 가면 갈수록 P2P 구조를 많이 사용하는 추세.


Need of Transport Service

데이터그램 패킷 스위칭

우리가 인터넷에서 쓰는 방식은 데이터그램 패킷 스위칭임.

단순한 구조로, 패킷이 전달 과정에서 오류가 생기더라도, 루트만 바꿔서 다시 패킷을 전송하면 됨.

 

Unreliable한 단점

1. out of order 문제 발생 가능

2. packet loss 문제 발생 가능

=> 따라서, Unreliable하다!! (추가로 connectionless함)

=> reliable한 성질을 부여하기 위해, TCP를 개발하게 됨.

 

TCP(Transmission Control Protocol)

- `connection-oriented(CO)`함. (이후 TCP 챕터에서 자세히 설명)

- `reliable`함

- `in-order delivery`임(패킷이 순서대로 도착함)
- UDP에 비해 상대적으로 `느림`

- congestion control, flow control을 사용함

- connection setup(연결을 여는 작업)이 필요함.

 

UDP(User Datagram Protocol)

- `connectionless`함

- `unreliable`함

- `out-of-order delivery`임(패킷이 순서대로 도착하지 않을 수도 있음)

- TCP와 달리 ACK가 사용되지 않기에 `빠름`

- 네트워크 상에 더 적은 트래픽이 지나다니게 됨.

 

이후 TCP 챕터에서 배우겠지만, TCP는 연결 열고, ACK 써서 제대로 세그먼트 갔는지 확인 해야 다음꺼 보내고, 연결 닫고 하는 과정이 필요해서 느림. 그러나 UDP는 그런 거 없이 바로 세그먼트를 슉 슉 슉 보내기 때문에 빠름.

 

어플리케이션에 따른 TCP/UDP 선택

- `loss`가 최소화되는 게 중요하면, `TCP`를 사용하면 좋음.

ex. 파일 전송

- `delay`가 최소화되는 게 중요하면, `UDP`를 사용하면 좋음.

ex. 실시간 온라인 게임

- 예를 들어, 웹 같은 경우는 loss에 민감하지만 time에는 그다지 민감하지 않기에, TCP를 보통 사용함.