[CSAPP] 11장 네트워크 프로그래밍

letsbebrave·2022년 5월 15일

cs

목록 보기
6/7

11.0 네트워크 관련 기본 용어

노드
일반적으로 네트워크에 연결된 모든 물리적인 기기 또는 장치
데이터를 보내는 송신지 or 데이터를 받는 수신지 역할

호스트
노드 중 어플리케이션을 실행할 수 있는 컴퓨팅 시스템을 갖춘 기기
IP 주소가 있어서 IP로 식별되는 노드라고도 불림

11.1 클라이언트 - 서버 프로그래밍 모델

클라이언트 - 서버 모델

모든 네트워크 응용 프로그램은 클라이언트 - 서버 모델에 기초한다.
이 모델을 사용해서 응용한 개서버 프로세스한 개 이상클라이언트 프로세스로 구성된다.
(즉 서버와 클라이언트는 1:N 관계)

트랜잭션

클라이언트-서버 모델에서 근본적인 연산은 트랜잭션이다.

  1. 클라이언트가 서비스를 필요로 할 때, 요청을 서버에 보냄
  2. 서버는 요청을 받고 해석하고 자원을 적절하게 조작함
  3. 서버는 응답을 클라이언트에게 보내고 다음 요청 기다림
  4. 클라이언트는 응답을 받고 처리함

11.2 네트워크

네트워크

네트워크는 규모를 기반으로 분류하여 LAN(Local Area Network)와 서울시 정도의 규모인 MAN(Metropolitan Area Network), 세계 규모인 WAN(Wide Area Network)로 나뉠 수 있다.

cf.
어댑터
네트워크에 물리적인 인터페이스를 제공해준다.

포트
프로세스를 구분해주는 게 포트

허브
각 포트에서 수신한 모든 비트를 종속적으로 다른 모든 비트
로 복사하여 모든 호스트가 모든 비트를 볼 수 있다.

MAC 주소
고유한 물리주소를 가지고 있는 컴퓨터와 라우터의 주소

네트워크 계층


PDU란 프로토콜 데이터 단위로 데이터 통신이 상위 계층이 전달한 데이터에 붙이는 제어정보를 뜻한다.

모든 계층에서 우리가 전송하는 데이터를 데이터라고 부르지 않게 되는 것이다. 물론 데이터 자체는 동일하지만, 각 계층을 거치면서 헤더 정보가 추가되면서 이름이 달라진다.

쉽게 생각하면 -
사용자는 Data 라고 부르고,
TCP는 Segment 라고 부르고,
IP는 Packet 이라고 부르고,
데이터링크는 Frame,
컴퓨터 하드웨어는 그것을 Bit 로 연산하고 다루게 되는 것.

프레임

데이터 링크 계층에서 전송되는 단위로, 단순히 노드와 노드 사이의 데이터를 전달한다. bit를 전송하는 물리층에 신뢰성을 더하기 위한 흐름제어 및 오류 제어 기능이 있다.

패킷

네트워크 계층에서 전송되는 단위로, 네트워크를 통해 전송될 때 라우터 등에서 전달하는 전송단위이다. 프레임을 다른 네트워크로 전달하기 위해서는 다시 한 번 봉투에 담아야 하는데, 이것이 패킷이다.
3계층에서 네트워크 간 통신이 가능하도록 라우팅을 해주는데, 이때 패키징 된 것이 패킷이다. 패킷 크기와 소스 및 목적지 호스트 주소를 포함하는 헤더와 소스 호스트가 보낸 데이터 비트를 포함하는 데이터로 구성된다.

정리하면,
프레임은 L2 영역에서의 전송 단위로 보면 되고, 패킷은 서로 다른 네트워크로 전달할 때의 데이터 단위라고 보면 된다.

LAN

빌딩이나 캠퍼스에 설치된다.

이더넷 (Ethernet)

가장 대중적인 LAN 기술

브릿지형 이더넷

전선들과 브릿지라고 하는 작은 상자들을 사용해서 브릿지형 이더넷이라고 하는 더 큰 LAN을 구성할 수 있다.

브릿지
허브보다 더 높은 전선의 대역폭을 가진다.
당연히 허브에서 보낸 것들을 받아야 하기 때문에 그렇다.

허브는 모든 호스트에 다 뿌리지만, 브릿지는 선택적으로 내가 필요한 루트로만 뿌려서 선택적으로 하나의 포트에서 다른 포트로 프레임을 복사한다. 그래서 대역폭을 절약할 수 있다.

라우터

라우터는 서버 컴퓨터처럼 네트워크와 네트워크 간 연결을 구성한다. 각 네트워크에 대해 연결할 수 있는 어댑터(포트)를 가지고 있다.
일반적으로 라우터는 임의의 LAN과 WAN들로부터 internet을 만들기 위해서 사용될 수 있다.

이때, 여러 가지 네트워크 간 차이를 줄여주는 게 각 호스트와 라우터에서 돌고 있는 프로토콜 소프트웨어 계층이다.

프로토콜

기본 기능

  • 명명법 (하나밖에 없는 IP 주소)
    서로 다른 LAN 기술은 주소를 호스트에 할당하는 방식이 다르다. 호스트 주소를 위한 통일된 포맷을 정의해서 차이점들을 줄인다.

  • 전달기법
    데이터 비트를 패킷이라는 통일된 단위로 묶어줘서 차이점을 줄인다. 패킷은 패킷 크기와 소스 및 목적지 호스트 주소를 포함하는 헤더와 소스 호스트가 보낸 데이터 비트를 포함하는 데이터로 구성된다.


(위) internet에서 데이터가 하나의 호스트에서 다른 호스트로 이동하는 방법
PH : internet packet header
FH1 : frame header for LAN1 <- LAN1에서만 보내는 것
FH2 : frame header for LAN2 <- LAN2에서만 보내는 것

프로토콜 소프트웨어에서 패킷의 내용 중 프레임 헤더를 FH1에서 FH2로 바꿔준다.

캡슐화 (중요)

데이터를 전송할 때, 데이터의 앞 부분에 전송할 때 필요한 정보를 담아서 보낸다. 이 정보를 헤더라고 하는데, 헤더에는 데이터를 전달받을 상대방에 대한 정보도 포함되어 있다.

이렇게 헤더를 붙여 나가는 것캡슐화라고 한다. 그리고 데이터를 받는 쪽에서, 헤더를 하나씩 제거해나가는데 이것을 역캡슐화라고 부른다.

계층5부터 계층7까지에 해당하는 응용계층에서는 웹사이트를 접속하기 위한 요청 데이터가 만들어진다. 그 다음으로는 계층4인 전송 계층으로 데이터가 전달되는데, 신뢰할 수 있는 통신이 이루어지도록 데이터에 헤더를 붙인다.

11.3 글로벌 IP 인터넷

각 인터넷 호스트는 TCP/IP 프로토콜을 구현한 소프트웨어를 실행한다.

인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O함수들의 혼합을 사용해서 통신한다. 소켓 함수들은 일반적으로 시스템 콜들로 구현되는데, 이 시스템 콜은 커널에서 트랩을 발생시키며, TCP/IP에서 다양한 커널 모드 함수들을 호출한다.

cf.
System Call

  • 커널 기능을 커널에 요청하는 방식이다. (인터페이스 같은 것)
  • Trap을 통해 실제로 커널에 정보가 전달된다.
  • System Call은 주변 장치, 메모리 관리 등 커널 모드에서만 조작 가능한 코드를 실행하기 위해 Trap을 통해 구현되었다.

https://teraphonia.tistory.com/790

TCP/IP 프로토콜

프로토콜의 집합으로 서로 다른 기능을 제공한다.

IP 프로토콜
IP 주소를 만들어주고 데이터 비트를 패킷이라는 통일된 단위로 묶어줘서 보내준다. 즉, 기본 명명법과 데이터그램이라고 하는 패킷을 한 인터넷 호스트에서 다른 호스트로 보낼 수 있는 전달 기법을 제공한다.

데이터가 중간에 유실되어도 복구하려고 유지하지 않아 안정적이지 않다. 또한 순서 보장도 되지 않는다.

UDP
데이터그램이 프로세스에서 프로세스로 전송될 수 있다.

TCP
IP 위에 구현한 복잡한 프로토콜로 프로세스들 간에 안전한 완전 양방향 연결을 제공한다. 또한 순서가 보장된다.

TCP: 데이터 순서 유지를 하고 연결이 잘 도착했는지 확인한다.
IP: 하나의 인터넷 호스트에서 다른 호스트로 보낼 수 있는 매커니즘을 제공한다. 즉, 해당 주소로 보내준다.


인터넷 응용의 하드웨어 및 소프트웨어 구성

11.3.1 IP 주소

IP 주소 구조체의 주소는 호스트 바이트 순서가 리틀 엔디안인 경우에도 항상 네트워크 바이트 순서(빅 엔디안)로 저장된다 by TCP/IP

소켓

연결의 종단점
각 소켓은 인터넷 주소 (IP주소)와 16비트 정수 포트로 이루어진 소켓 주소를 가진다.
address : port
연결은 두 개의 종단점의 소켓 주소에 의해 유일하게 식별된다. 클라이언트의 소켓 주소와 서버의 소켓 주소를 소켓쌍이라고 한다.
cliaddr:cliport, servaddr:servport)

11.4.2 socket 함수

소켓 식별자를 생성하기 위해 사용되는 함수

clientfd = int socket(int domain, int type, int protocol);

SOCKET socket(

  _In_  int af, -> 소켓이 사용할 프로토콜 체계 
 				   PF_INET과 AF_INET 중 하나

  _In_  int type, -> 소켓의 타입
  				     SOCK_STREAM: TCP 소켓
                     SOCK_DGRAM: UDP 소켓

  _In_  int protocol -> 프로토콜 체계중 실제적으로 상요할 프로토콜 (C언어의 ENUM값으로 지정된 인자값)

);


출처: https://jjoreg.tistory.com/entry/열혈강의-TCPIP [다다]

예시

  • IPv4 인터넷 프로토콜 체계에서 동작하는 연결지향형 TCP 소켓을 생성하여 반환하라.
    SOCKET socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  • IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결지향형 UDP 소켓을 생성하여 반환하라.
    SOCKET socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

출처

https://velog.io/@hidaehyunlee/데이터-세그먼트-패킷-헷갈릴-땐-PDU를-알아보자
https://ict-story.tistory.com/39
https://davinchicoder.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%BA%A1%EC%8A%90%ED%99%94%EC%99%80-%EC%97%AD%EC%BA%A1%EC%8A%90%ED%99%94

profile
그게, 할 수 있다고 믿어야 해

0개의 댓글