📝 컴퓨터 네트워크 — 1~8주차 정리
📝 개요
컴퓨터 네트워크 3학년 1학기 — 1~8주차 전체 정리
OSI 7계층 · 교환방식 · IPv4 서브네팅 · DNS · ARP · 소켓(C) 프로그래밍 전반
OSI 7계층 · 교환방식 · IPv4 서브네팅 · DNS · ARP · 소켓(C) 프로그래밍 전반
📅 1~3주차 — 네트워크 기초 이론
OSI 7계층, 교환방식, MAC 접근제어, IPv4 주소체계, DNS, ARP, 토폴로지 등 개념 정립 주차
🏛️ OSI 7계층 vs TCP/IP ⭐
| OSI 계층 | TCP/IP 계층 | PDU | 주소 | 대표 장비/프로토콜 |
|---|---|---|---|---|
| 7. 응용 | 응용 | — | — | HTTP, FTP, DNS |
| 6. 표현 | (응용 포함) | — | — | TLS/SSL |
| 5. 세션 | (응용 포함) | — | — | 세션 관리 |
| 4. 전송 | 전송 | Segment(TCP) / Datagram(UDP) | Port | TCP, UDP |
| 3. 네트워크 | 인터넷 | Packet | IP 주소 | IP, ICMP, 라우터 |
| 2. 데이터링크 | 네트워크 접근 | Frame | MAC 주소 | 스위치(L2), ARP |
| 1. 물리 | 물리 | bit | — | 허브, 케이블 |
- OSI는 참조 모델(Reference Model)이지 프로토콜이 아님. 실제 인터넷은 TCP/IP 중심.
L7
응용 · HTTP, FTP, DNS
L4
전송 · TCP/UDP · Segment · Port
L3
네트워크 · IP · Packet · 라우터
L2
데이터링크 · Frame · MAC · 스위치
L1
물리 · bit · 허브/케이블
🔀 교환 방식 3가지 ⭐
- 회선 교환(Circuit Switching): 전용 통로를 먼저 설정. 통신이 없어도 회선 점유 → 비효율. 예: 전통 전화망
- 메시지 교환(Message Switching): 메시지 전체를 저장(Store) → 전달(Forward). 대용량 시 지연 큼
- 패킷 교환(Packet Switching): 데이터를 패킷 단위로 분할 전송. 현대 인터넷의 근간
- 데이터그램: 각 패킷이 독립적으로 라우팅 (IP)
- 가상회선: 논리적 경로 설정 후 전송 (X.25, ATM)
📡 MAC 접근 제어 방식 ⭐
- ALOHA: 전송하고 싶을 때 바로 전송 → 충돌 빈번
- CSMA: 전송 전에 채널 사용 여부 감지(Carrier Sense)만 함
- CSMA/CD: 전송 도중에도 채널 감시 → 충돌 감지 시 전송 중단 후 랜덤 대기 재전송. 이더넷의 기본 개념
📤 전송 유형
- 유니캐스트: 1:1 (특정 수신자 1명)
- 멀티캐스트: 1:N (가입 그룹에만)
- 브로드캐스트: 1:ALL (같은 L2 도메인 전체)
- 애니캐스트: 1:1 (동일 주소 중 가장 가까운 노드 1곳)
🕸️ 토폴로지 ⭐
| 형태 | 특징 | 장점 | 단점 |
|---|---|---|---|
| 버스(Bus) | 공통 케이블에 모두 연결 | 설치 단순, 케이블 절약 | 케이블 장애 시 전체 영향 |
| 스타(Star) | 중앙 장비에 1:1 연결 | 관리/확장 쉬움 | 중앙 장비 고장 시 전체 마비 |
| 메시(Mesh) | 여러 경로로 촘촘히 연결 | 장애에 강함, 신뢰성 높음 | 비용/구성 복잡 |
| 링(Ring) | 원형 연결, 순차 전달 | 충돌 적음 | 한 구간 장애 시 전체 영향 |
🔢 IPv4 주소 클래스 ⭐
| 클래스 | 첫 옥텟 범위 | 구조 | 기본 서브넷 마스크 |
|---|---|---|---|
| A | 1~126 | N.H.H.H | 255.0.0.0 |
| B | 128~191 | N.N.H.H | 255.255.0.0 |
| C | 192~223 | N.N.N.H | 255.255.255.0 |
| D | 224~239 | — | 멀티캐스트용 |
| E | 240~254 | — | 실험용 |
127.x.x.x = 루프백/진단용 예약
🌐 DNS & 도메인 ⭐
sequenceDiagram
actor U as 사용자 PC
participant LR as Local Resolver
(ISP DNS) participant ROOT as Root (.) participant TLD as TLD (.com) participant AUTH as Authoritative
example.com U->>LR: www.example.com? LR->>ROOT: .com 서버는? ROOT-->>LR: .com TLD 서버 주소 LR->>TLD: example.com 서버는? TLD-->>LR: Authoritative 주소 LR->>AUTH: www.example.com A? AUTH-->>LR: 93.184.216.34 LR-->>U: 93.184.216.34 (TTL 캐시)
(ISP DNS) participant ROOT as Root (.) participant TLD as TLD (.com) participant AUTH as Authoritative
example.com U->>LR: www.example.com? LR->>ROOT: .com 서버는? ROOT-->>LR: .com TLD 서버 주소 LR->>TLD: example.com 서버는? TLD-->>LR: Authoritative 주소 LR->>AUTH: www.example.com A? AUTH-->>LR: 93.184.216.34 LR-->>U: 93.184.216.34 (TTL 캐시)
- PC(Stub resolver) → 재귀 리졸버: 요청 (재귀 질의)
- 재귀 리졸버 → Root → TLD → 권한 DNS: 순차 질의 (반복 질의)
- 결과를 PC에 전달 + TTL만큼 캐시
| 레코드 | 역할 |
|---|---|
| A | 도메인 → IPv4 |
| AAAA | 도메인 → IPv6 |
| CNAME | 도메인 → 다른 도메인(별칭) |
| NS | 권한 네임서버 정보 |
| MX | 메일 서버 정보 |
| TXT | 텍스트 정보 (SPF 등) |
🔍 ARP ⭐
- IP → MAC 변환 프로토콜 (L2 전송을 위해 필수)
- ARP Request = 브로드캐스트 (“이 IP의 MAC이 뭐야?”)
- ARP Reply = 유니캐스트 (해당 장치가 MAC을 알려줌)
- 같은 서브넷: 목적지 IP의 MAC을 ARP로 찾아 직접 전달
- 다른 서브넷: 게이트웨이(라우터) IP의 MAC을 ARP로 찾아 라우터에 먼저 전달
sequenceDiagram
participant A as Host A
10.0.0.2 participant BR as Broadcast
FF:FF:FF:FF:FF:FF participant B as Host B
10.0.0.3 A->>BR: ARP Request
"10.0.0.3 의 MAC?" BR->>B: 브로드캐스트 수신 B-->>A: ARP Reply (유니캐스트)
"10.0.0.3 = AA:BB:CC:DD:EE:FF" Note over A: ARP 테이블 캐시
(기본 TTL ~20분)
10.0.0.2 participant BR as Broadcast
FF:FF:FF:FF:FF:FF participant B as Host B
10.0.0.3 A->>BR: ARP Request
"10.0.0.3 의 MAC?" BR->>B: 브로드캐스트 수신 B-->>A: ARP Reply (유니캐스트)
"10.0.0.3 = AA:BB:CC:DD:EE:FF" Note over A: ARP 테이블 캐시
(기본 TTL ~20분)
📅 4주차 — LAB 10.7.5 Class B 서브네팅
네트워크 ID 150.193.0.0 (Class B) 서브네팅 실습 — ANDing 연산으로 같은/다른 서브넷 판별
🧮 ANDing 연산 ⭐
- 호스트 IP와 서브넷 마스크를 비트 AND 연산 → 서브넷(네트워크) 주소 도출
- 1 AND 1 = 1 / 1 AND 0 = 0 / 0 AND 0 = 0
- 같은 서브넷 = ANDing 결과 동일 / 다른 서브넷 = ANDing 결과 다름
- 다른 서브넷으로 패킷 전송 시 → 기본 게이트웨이(라우터)로 먼저 전달
📐 서브네팅 계산법
- 빌린 비트 수 n개 → 서브넷 수: 2ⁿ, 호스트 수: 2^(나머지 비트) − 2
- 첫 번째(네트워크)·마지막(브로드캐스트) 서브넷 사용 불가
- Class B 기본 마스크
255.255.0.0에서 3번째 옥텟을 빌려 서브넷 분할
🔍 실습 예제 — Host X vs Host Z
| 항목 | 값 | 2진수 (3·4옥텟) |
|---|---|---|
| Host X IP | 150.193.4.10 | 00000100 . 00001010 |
| Host Z IP | 150.193.12.10 | 00001100 . 00001010 |
| 마스크 | 255.255.240.0 | 11110000 . 00000000 |
| X ANDing | 150.193.0.0 | 00000000 . 00000000 |
| Z ANDing | 150.193.0.0 | 00000000 . 00000000 |
마스크255.255.240.0기준: X와 Z의 ANDing 결과가 동일 → 같은 서브넷 (라우터 거치지 않고 직접 통신 가능)
만약 마스크가255.255.248.0라면 X=150.193.0.0 / Z=150.193.8.0 → 다른 서브넷이 됨
📅 5~7주차 — Ch.2 소켓 프로그래밍 (C)
Linux BSD Socket API, 주소구조체, 바이트오더, 에코 서버/클라이언트 구현
🔌 소켓 기본 개념
- 소켓 = 네트워크 통신 엔드포인트
- 리눅스에서 소켓은 파일처럼 취급 →
socket()반환값이 정수형 FD(파일 디스크립터) close(fd)로 해제 (파일과 동일)
📞 서버 vs 클라이언트 흐름 ⭐
서버: socket() → bind() → listen() → accept() → read/write → close()
클라이언트: socket() → connect() → write/read → close()
sequenceDiagram
participant S as Server
participant C as Client
S->>S: socket()
S->>S: bind(port)
S->>S: listen()
C->>C: socket()
C->>S: connect()
S->>S: accept() → new fd
C->>S: write() / send()
S->>C: read() / recv()
S->>C: write() 응답
C->>S: close()
S->>S: close(client_fd)
🔁 바이트 오더 변환 함수 ⭐
| 함수 | 용도 | 비트 |
|---|---|---|
htons() | Host→Network 포트 변환 | 16비트 (Short) |
htonl() | Host→Network IP 변환 | 32비트 (Long) |
inet_addr() | 문자열 IP → 이진수 변환 | — |
inet_ntoa() | 이진수 → 문자열 IP 변환 | — |
- 포트(16비트) →
htons()/ IP/주소(32비트) →htonl() INADDR_ANY+htonl(): 특정 IP가 아닌 모든 인터페이스에서 연결 수락
📦 주소 구조체
struct sockaddr_in {
short sin_family; // 주소 체계 (AF_INET)
unsigned short sin_port; // 16비트 포트 번호
struct in_addr sin_addr; // 32비트 IP 주소
char sin_zero[8]; // 패딩
};
struct in_addr { unsigned long s_addr; };
struct servent { char *s_name; int s_port; ... }; // /etc/services
struct hostent { char *h_name; char **h_addr_list; ... }; // /etc/hosts
📄 open_socket.c — 기본 소켓 생성
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP
if (sockfd < 0) { perror("socket"); return 1; }
close(sockfd);
return 0;
}
📄 mvecho.c — 에코 클라이언트
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(7); // echo 포트
serv.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sockfd, (struct sockaddr*)&serv, sizeof(serv));
write(sockfd, buf, strlen(buf));
read(sockfd, recv, sizeof(recv));
📄 mvecho_server.c — 에코 서버
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = { AF_INET, htons(PORT), { htonl(INADDR_ANY) } };
bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));
listen(server_fd, 5);
while (1) {
int client_fd = accept(server_fd, NULL, NULL);
int n = read(client_fd, buf, sizeof(buf));
write(client_fd, buf, n); // echo
close(client_fd);
}
🗣️ Talk 프로그램 — fork() 사용 이유 (6주차) ⭐
read()/write()는 Blocking → 한 프로세스로 송수신 동시 처리 불가fork()로 프로세스 복제 → 부모: 송신(write) / 자식: 수신(read)+출력- 종료 문자열:
exit\n
📝 8주차 — 중간고사 정리 & 예상 출제
1~7주차 전체 내용 요약 + 시험 핵심 포인트
🎯 핵심 암기 키워드
- OSI 계층별 PDU: bit → Frame → Packet → Segment
- CSMA/CD: 이더넷의 기본, 충돌 감지 후 랜덤 대기 재전송
- ANDing: IP & Mask = 서브넷 주소 → 같으면 같은 서브넷
- DNS: 클라이언트는 재귀 질의, 리졸버는 반복 질의
- ARP Request = 브로드캐스트 / Reply = 유니캐스트
- 소켓 호출 순서: 서버 6단계, 클라이언트 4단계
- htons vs htonl: 포트=16비트=htons, 주소=32비트=htonl
📋 예상 출제 유형
- OSI 7계층 각 계층의 역할·PDU·대표 프로토콜 서술
- 회선 교환 vs 패킷 교환 차이 (“자원 점유 방식” 관점으로)
- CSMA vs CSMA/CD 차이 (“충돌 처리” 관점으로)
- ANDing 연산으로 서브넷 주소 도출 (이진수 계산 포함)
- 서브넷 빌린 비트 수 계산 (서브넷 수·호스트 수 도출)
- DNS 재귀 질의 vs 반복 질의 설명
- ARP 동작 흐름 (같은 서브넷 vs 다른 서브넷)
- 소켓 서버/클라이언트 호출 순서 직접 작성
htons()vshtonl()언제 쓰는지fork()기반 Talk 프로그램에서 부모/자식 역할