(25.03.28)
[이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접]의 [Chapter 5. 네트워크]를 읽고 구글링을 통해 보충하여 정리한 내용
1. 네트워크의 개념
- 네트워크는 유무선의 통신 매체로 연결된 서로 다른 두 호스트(의 프로세스) 간에 데이터를 주고 받는 것이다.
- 네트워크를 그래프의 자료구조로 이해했을 때, 호스트를 노드, 통신 매체를 간선으로 그릴 수 있다.
- 모든 통신은 요청과 응답의 한 쌍으로 이루어지며, 요청을 하는 주체를 클라이언트, 요청을 받는 주체는 서버라고 칭한다.
- (주로 공유기를 통해) 가까운 거리를 연결하는 LAN에 속한 기기들을 같은 네트워크에 속한 것으로 칭한다. 다른 네트워크에 있는 기기와 통신할 수 있는 것은 WAN이 구축되어 있기 때문이다.
- 패킷 교환 네트워크: 전송하려는 데이터의 크기가 클 경우, 데이터를 쪼개어 전송해야 한다. 데이터를 쪼개는 단위를 패킷이라고 하며, 서버와 클라이언트는 패킷 단위로 요청과 응답을 주고 받는다. 패킷은 헤더와 페이로드로 구성되어있다.
2. 네트워크 참조 모델
- 통신이 이루어지는 단계를 계층적으로 표현한 것으로, 대표적으로 OSI 7계층, TCP/IP 모델이 있다.

- 교재에서는 현재 전세계 표준으로 사용되고 있는 가장 오른쪽의 TCP/IP updated model의 5계층을 사용하여 서술하고 있다.
- 응용 계층은 개발자가 작성한 코드에 의해 동작하고, 하위 계층부터는 운영체제의 Network Stack에 의해 동작한다고 이해할 수 있다.

- 각 계층에서는 상위 계층의 패킷을 페이로드로 삼아 사용하는 프로토콜에 맞는 헤더를 덧붙여나간다. 이 과정을 캡슐화라고 하고, 패킷을 수신받는 입장에서는 계층을 하나씩 올라가면서 헤더를 제거해 원본 데이터를 얻는다. 역캡슐화이다.
3. 물리 계층과 데이터 링크 계층
- 물리 계층은 실제로 데이터를 전기적인 신호를 통해 전달하는 계층으로, 크게 유선과 무선으로 전달방법을 나눌 수 있다. 데이터 링크 계층과 밀접한 관계를 가지며, 물리 계층의 종류에 따라 사용할 수 있는 데이터 링크 계층의 프로토콜이 정해져있다. 대표적으로 유선 LAN의 경우 이더넷을 사용하고, 무선 LAN의 경우 와이파이를 사용한다.
1) 유선 LAN
- 트위스티드 페어 케이블: 구리선을 통해 전기적인 신호를 주고 받기 때문에, 전기 신호에 왜곡을 줄 수 있는 주변 잡음(노이즈)에 취약하다. 따라서 구리선 주변을 보호하는 방법인 차폐를 통해 노이즈를 방지하는데, 사용하는 실드의 종류에 따라 UTP, FTP, STP 케이블 등으로 분류된다.
- 데이터 링크 계층에서 사용하는 패킷을 프레임이라고 부르는데, 이더넷 기반의 네트워크에서 사용하는 프레임은 다음과 같이 구성되어 있다.

- 프리앰블은 송수신지 동기화를 위해 사용되는 8바이트이다.
- MAC 주소
- 유/무선의 통신 매체가 호스트와 연결된 지점을 네트워크 인터페이스 라고 한다. 통신 매체가 받아들인 전기 신호를 호스트가 이해할 수 있는 형태의 데이터(프레임)로 변환하는 인터페이스가 필요한 것이다. NIC(Network Interface Controller)라는 하드웨어가 담당하며, NIC마다 (고유한) MAC 주소가 부여된다.
- 따라서 MAC 주소를 통해 송수신지를 특정할 수 있다.
- 호스트가 여러개의 네트워크 인터페이스를 가진다면 MAC 주소도 여러개 가진다.
- Type: 해당 위치에 1500 이하의 값이 작성되면 프레임의 크기를 나타내고, 1536 이상의 값이 작성되면 상위 계층(네트워크 계층)에서 사용하는 프로토콜을 나타낸다.
- Data
- 프레임으로 보낼 수 있는 데이터(=네트워크 계층의 패킷)의 크기에는 제한이 있으며, 일반적으로 1500바이트이며 MTU(Maximum Transmission Unit)라고 부른다.
- MTU보다 큰 데이터를 보낼 경우 여러 패킷으로 나뉘어 보내진다.
- CRC: 상위 계층들의 패킷과는 다르게 헤더와 더불어 트레일러(데이터의 뒤에 붙는 부분)가 존재한다. 프레임의 오류가 있는지 여부를 확인하기 위한 오류 검출용 값이다. 송신지에서 데이터에 대한 CRC값을 계산해 프레임에 붙여 보내면, 수신지에서도 전달받은 데이터에 대해 CRC값을 계산하고 비교하여 전달받은 프레임에 오류가 있는지를 확인할 수 있다.
2) 무선 LAN
- 전파: 약 3kHz부터 3THz 사이의 진동수를 갖는 전자기파를 의미한다. 와이파이는 주로 2.4GHz 혹은 5GHz의 주파수 대역을 사용한다.
- 사용하는 주파수 대역이 겹칠 경우 신호의 간섭이 발생한다. 따라서 주파수 대역마다 채널이라는 하위 주파수 대역으로 세분화하여 사용한다.
3) 허브와 스위치

- 허브는 전달받은 신호를 모든 포트로 내보낸다.
- 반이중 모드로 송수신한다: 송신은 한번에 하나의 호스트만 가능하다.

- 스위치는 전달받은 신호를 목적지 포트로만 보낸다.
- MAC 주소 학습 기능이 있어 MAC 주소 테이블을 생성하여 참조할 수 있기 때문이다.
- VLAN(Virtual LAN): 같은 스위치에 연결되었더라도 여러 개의 논리적인 네트워크로 나눌 수 있다.
4. 네트워크 계층
- 다른 LAN(네트워크)에 속한 호스트 간의 통신을 위해서는 네트워크 계층 이상의 작동이 필요하다.

- 라우터와 IP 주소
- IP 주소는 호스트가 속한 네트워크와 네트워크에 속한 호스트를 특정하기 위해 사용하는 32비트 주소값이다.
- 사설 IP 주소와 공인 IP 주소가 있는데, 사설 IP 주소는 네트워크 내부에서 호스트를 구별하기 위한 주소로, 네트워크 내부에서만 고유하다. (전세계에 같은 사설 IP 주소를 가지는 호스트가 매우 많다.) 공인 IP 주소는 전세계에서 고유한 값을 가진다. 따라서 A네트워크의 호스트가 B네트워크 내부의 호스트에게 요청을 보낼 때는, B네트워크의 라우터의 공인 IP 주소를 destination address로 설정하여 해당 네트워크까지 도달할 수 있다.
- 라우터는 게이트웨이의 역할을 한다.
- 일단 라우터를 통해 B네트워크 앞까지 도달하면, 다음 계층인 데이터 링크 계층에서 MAC 주소를 확인하여 내부의 호스트를 특정한다.
- 라우터는 IP 주소를 기반으로 패킷의 최적 경로를 결정하여 목적지까지 전달한다.

- Time to Live (TTL): 패킷의 수명을 의미하며, 무의미한 패킷이 네트워크 상에 남아있는 것을 방지하기 위한 것으로 패킷이 하나의 호스트나 라우터를 거칠때마다 1씩 줄어든다.
- 단편화: MTU보다 큰 크기의 IP패킷은 여러 패킷으로 쪼개서 전송된다.
- Identification: 같은 정보에서 쪼개진 패킷들은 같은 식별자를 공유한다.
- flags: 3비트로 구성된 필드로, 두번째 비트는 DF(Don't Fragment), 세번째 비트는 MF(More Fragment)로 단편화된 패킷이 더 있음을 나타낸다.
- fragment offset: 단편화된 패킷의 재조합을 위해 특정 패킷이 초기 데이터로부터 얼마나 떨어져 있는지를 명시한 필드이다.
- IP 단편화는 성능 저하를 불러오므로 되도록이면 단편화가 발생하지 않도록 IP 패킷을 주고받는 경로에 존재하는 모든 호스트의 MTU를 고려한 최대 MTU 크기인 경로 MTU만큼씩만 주고받도록 한다.
- IP는 신뢰할 수 없는 프로토콜이며 비연결형 프로토콜이다. (성능)
- 신뢰할 수 없는 프로토콜: 패킷이 수신지까지 제대로 전송되었다고 보장하지 않음
- 비연결형 프로토콜: 패킷을 주고받기 전에 상대 호스트와의 사전 연결 과정을 거치지 않는다
- 이를 보완하기 위한 방법
- 상위 계층의 프로토콜을 이용한다. (TCP)
- ICMP(Internet Control Message Protocol)을 이용한다
- IP 패킷의 전송 과정에 대한 피드백 메세지를 얻기 위한 프로토콜이다.
- ARP(Address Resolution Protocol): LAN 내부 통신에서, 상대 호스트의 (사설) IP 주소만 알고 MAC 주소를 모르는 경우에 사용하는 프로토콜이다.
- 통신 과정에서는 반드시 IP 주소와 MAC 주소 모두가 필요하다.
- 브로드캐스트 메세지 (네트워크 내의 모든 호스트에게 보내는 메세지)로 알고 싶은 IP 주소가 포함된 ARP 요청 메세지를 보내면, 해당 IP의 호스트가 자신의 MAC 주소를 담은 ARP 응답 메세지를 보낸다.
- ARP 통신을 통해 알게 된 <IP 주소, MAC 주소> 쌍들을 호스트 내부에 ARP 테이블의 형태로 저장해둔다.
5. 전송 계층
- 네트워크 계층까지는 IP 주소와 MAC 주소를 사용하여 통신할 호스트까지 특정할 수 있었다. 하지만 최종 송수신 대상은 호스트 내부의 특정 프로세스이다. 프로세스는 포트번호를 통해 특정할 수 있다.
- NAT(Network Address Translation): 공인 IP 주소와 사설 IP 주소 간의 변환
- NAT 기능을 가진 라우터나 공유기는 n개의 공인 IP 주소를 가진다. 적은 수의 공인 IP 주소를 내부 호스트 간에 공유한다.

- TCP는 신뢰할 수 있는 프로토콜이며 연결형 프로토콜이고, UDP는 신뢰할 수 없는 프로토콜이며 비연결형 프로토콜이다. 따라서 패킷의 유실이 없는 안전한 프로토콜을 사용하려면 TCP, 빠른 송수신 속도만을 원한다면 UDP를 선택하면 된다. 아래는 TCP 패킷 헤더와 설명이다.

- 순서 번호(Sequence Number)란 TCP 세그먼트의 올바른 송수신 순서를 보장하기 위해 매겨진 번호이다. 순서 번호를 통해 해당 세그먼트가 송수신하고자 하는 데이터의 몇번째 바이트에 해당하는지 알 수 있다.
- 확인 응답 번호(Acknowledgment Number)란 상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하고자하는 순서 번호(받은 순서번호 +1)로 설정한다.
- ACK 플래그를 1로 설정하여 해당 세그먼트가 확인 응답 번호를 포함하고 있음을 알린다.
- 연결형 프로토콜: 패킷을 주고받기 전에 연결 수립 과정을 거친다.
- 연결 수립 과정: 3-way handshake
- 순서 번호와 확인 응답 번호를 주고받으며 상대 호스트를 확인하고, 처음 연결을 시작하는 과정을 액티브 오픈, 요청을 받아 연결을 수립하는 과정을 패시브 오픈이라고 칭한다.
- TCP는 상태를 유지하고 관리하는 스테이트풀(Stateful) 프로토콜이다. TCP 송수신 과정에는 다양한 상태가 존재한다.

- 연결 종료 과정
- 연결 수립 과정과 유사하게 세그먼트를 주고받으며 연결을 종료한다. 패시브 클로즈 호스트는 마지막 ACK 세그먼트가 도착하는 즉시 CLOSED 상태로 전환되는 반면 액티브 클로즈 호스트는 마지막 ACK 세그먼트가 올바르게 전송되는 것을 확인하기 위해 일정 시간을 대기한 후 CLOSED 상태가 된다.

6. 응용 계층
- 응용 계층에서는 IP 주소값이 아닌 도메인 네임을 통해 호스트를 특정할 수 있다. 호스트는 도메인 네임에 대한 IP 주소가 저장된 네임 서버에 도메인 네임을 질의함으로써 호스트의 실제 IP 주소를 얻는다.
- 네임 서버는 계층적 형태를 이루고 있다. 클라이언트는 제일 먼저 자신과 가장 가까운 네임 서버인 로컬 네임 서버에 도메인 네임을 질의하고, 로컬 네임 서버에 해당 도메인 네임에 대한 IP 주소가 저장되어 있지 않을 경우 로컬 네임 서버는 상위 네임 서버들에게 차례로 질의하여 클라이언트에게 IP주소값을 반환한다.

-
응용계층에서 사용하는 프로토콜인 HTTP의 주된 목적은 데이터의 형식에 구애받지 않고 다양한 애플리케이션 데이터의 송수신을 가능하게 하는 것이다.
- HTTP는 요청-응답 기반 프로토콜이다.

- HTTP는 미디어 독립적 프로토콜이다.
- 주고받을 미디어 타입(자원의 특성)에 제한을 두지 않고 자원을 주고 받는 수단, 즉 인터페이스의 역할만 수행한다.
- HTTP는 상태를 유지하지 않는 스테이트리스 프로토콜이다.
- 서버는 HTTP 요청을 보낸 클라이언트 관련 상태를 기억하지 않는다. 모든 요청을 독립적으로 간주한다.
- 따라서 특정 클라이언트가 특정 서버에 종속되지 않게 되므로, 서버의 추가나 대체가 쉬워진다. (확장성과 견고성)
- HTTP는 지속 연결(킵 얼라이브) 프로토콜이다.
- 하나의 TCP 연결 상에서 여러 개의 요청-응답을 주고받을 수 있다. (HTTP 1.1과 2.0은 TCP를 기반으로 동작한다.)
-
스테이트리스한 HTTP의 특성을 보완하기 위해 HTTP 쿠키를 활용한다. 쿠키는 서버에서 생성되어 응답 메세지의 Set-Cookie 헤더를 통해 클라이언트에게 전송되고, 클라이언트는 쿠키를 저장해 두었다가 추후 같은 서버에 요청을 보낼때마다 요청 메세지의 Cookie 헤더에 쿠키 값을 (자동으로) 포함하여 전송한다. Expires를 통해 명시한 시점이 지나거나 Max-Age로 명시된 유효기간이 지나면 해당 쿠키는 삭제되어 전송되지 않는다.
- 웹 브라우저 내부에는 쿠키 이외에도 Web Storage라는 저장공간이 있다. 일반적으로 쿠키보다 큰 데이터를 저장할 수 있으며, 서버로 데이터를 자동 전송하지 않는다.
- Web Storage에는 Local Storage와 Session Storage가 있으며, Local Storage는 별도로 삭제하지 않는 한 영구적으로 저장 가능한 정보이며, Session Storage는 세션이 유지되는 동안만 유지되는 정보이다.
-
HTTP 캐시: 응답 받은 자원의 사본을 임시 저장하여 불필요한 대역폭 낭비와 응답 지연을 방지한다.
- 캐시는 클라이언트(private cache) 또는 클라이언트와 서버 사이의 중간 서버(public cache)에 저장되기도 한다.
- 서버의 원본 데이터가 변경되어 원본 데이터와 캐시된 사본 데이터 간의 일관성이 깨질 수 있다. 두 데이터 간의 유사한 정도를 캐시 신선도라고 표현한다. 캐시의 유효기간을 설정하여 캐시 신선도를 높게 유지할 수 있다.
- 유효기간이 지난 캐시 데이터에 대한 요청이 들어올 경우, 서버에게 원본 자원이 변경된 적이 있는지를 질의한다(If-Modified-Since 헤더).
- 원본 자원이 변경된 경우, 서버는 상태코드 200과 함께 새로운 자원을 반환한다.
- 원본 자원이 변경되지 않은 경우, 서버는 304(Not Modified)를 통해 자원이 변경되지 않았음을 알리고 클라이언트는 캐시된 자원을 그대로 사용한다.
- 원본 자원이 삭제된 경우, 서버는 404(Not Found)를 통해 자원이 존재하지 않음을 알린다.
- 또한, 자원의 버전을 식별하기 위한 Etag(엔티티 태그) 값을 기반으로 If-None-Match 헤더를 이용해 질의할 수도 있다.
-
콘텐츠 협상: 요청한 자원에 대해 클라이언트에게 가장 적합한 자원의 표현을 제공한다.
- 클라이언트는 요청 시 선호하는 자원의 표현을 Accept, Accept-Language, Accept-Encoding의 콘텐츠 협상 헤더를 통해 서버에게 전송한다.
-
HTTPS: HTTP에 SSL 혹은 TLS 프로토콜의 동작이 추가된 프로토콜

- SSL/TLS 기반의 암호화 통신이 이루어진다. SSL과 TLS는 인증과 암호화를 수행하는 프로토콜이다.
- 일반적인 HTTP 메시지 송수신 과정 전에, (TLS 기반일 경우) 상대 호스트에 대한 확인과 암호화에 사용할 키를 생성/교환하는 과정이 이루어지는 TLS 핸드셰이크 과정이 추가된 것이다.
7. 서버와 트래픽 관리
- 특정 컴퓨터 시스템이 주어진 기능을 실제로 수행할 수 있는 시간의 비율을 가용성이라고 한다. 가용성을 높이기 위해 (오리진) 서버를 다중화한다.
- 클라이언트와 다중화된 오리진 서버 사이에는 중간 서버들이 존재할 수 있는데, 대표적인 중간 서버의 유형에는 프록시와 게이트웨이가 있다.
- 프록시: 클라이언트 암호화 및 접근 제한의 기능을 수행한다. 클라이언트가 선택한 메세지 전달의 대리자라고 한다.

- 게이트웨이(리버스 프록시): 오리진 서버로 향하는 요청 메세지들을 먼저 받아서 전달한다.
