1. Content-type과 Content-length 헤더
- content-Type
- HTTP 요청 및 응답의 본문 데이터 미디어 타입을 지정하는 데 사용
- 클라이언트와 서버는 이 헤더를 전송하여 전송되는 데이터의 형식을 이해하고 처리할 수 있다.
- 예시
- 'Content-Type: text/html; charset=UTF-8' : HTML 문서
- `Content-Type: application/json; charset=UTF-8` : JSON 데이터
- `Content-Type: image/png` : PNG 이미지
- 주요 미디어 타입
- `text/plain` : 일반 텍스트
- `text/html` : HTML 문서
- `application/json` : JSON 데이터
- `application/xml` : XML 데이터
- `image/jpeg` : JPEG 이미지
- `image/png` : PNG 이미지
- `multipart/form-data` : 파일 업로드 등 여러 데이터 타입을 포함하는 양식 데이터
- Content-Length 헤더
- HTTP 요청 및 응답 본문의 크기를 바이트 단위로 지정한다
- 클라이언트와 서버는 이 헤더를 통해 전송되는 데이터의 크기를 파악하고, 연결을 유지하거나 닫는 등의 처리를 할 수 있다.
- 주요 역할
- 데이터 크기 파악 : 서버는 클라이언트로부터 전송된 요청의 본문 크기를 알고, 이를 바탕으로 데이터 처리를 시작
- 연결 관리 : 클라이언트와 서버는 본문의 크기를 알고, 데이터 전송 후 연결을 종료하거나 유지할 수 있다
- 정확한 데이터 전송 : Content-Length 헤더는 데이터의 정확한 크기를 명시함으로써, 데이터의 일부만 전송되거나 더 많은 데이터가 전송되는 문제를 방지
2. TCP 와 UDP
> 두 가지 주요 전송 계층 프로토콜로 각각의 특성과 용도에 따라 다르게 사용된다.
- TCP(Transmission Control Protocol
- 연결 지향적
- 데이터 전송을 시작하기 전에 송신자와 수신자 간에 연결을 설정합니다. 이를 위해 TCP는 "3-way handshake"라는 과정을 사용
- 연결이 설정되면, 데이터는 양방향으로 전송
- 신뢰성
- TCP는 데이터의 전송이 성공적으로 이루어졌는지 확인하고, 손실된 데이터가 있으면 이를 재전송
- 데이터가 올바른 순서로 도착하도록 보장
- 흐름 제어
- 송신자가 수신자의 데이터 처리 속도를 초과하지 않도록 조절
- 수신자는 자신의 버퍼 크기에 따라 송신자에게 데이터를 더 보내도 되는지 알려준다
- 혼잡 제어
- 네트워크 혼잡을 줄이기 위해 데이터 전송 속도를 조절
- 장점
- 데이터 전송의 신뢰성과 순서를 보장
- 데이터 손실, 중복, 순서 문제를 자동으로 처리
- 단점
- 초기 연결 설정 (3-way handshake)로 인해 시작 시간이 지연될 수 있음
- 추가적인 헤더 정보와 제어 메시지로 인해 오버헤드가 발생
- 사용 예시
- 웹 브라우징 (HTTP/HTTPS)
- 이메일 (SMTP, IMAP, POP3)
- 파일 전송 (FTP)
- 원격 로그인 (SSH, Telnet)
- 연결 지향적
- UDP (User Datagram Protocol)
- 비연결 지향적
- 송신자와 수신자 간에 연결을 설정하지 않고 데이터를 전송
- 각 데이터그램은 독립적으로 처리
- 비신뢰성
- 데이터그램이 손실되거나 중복되거나 순서가 뒤바뀔 수 있다
- 데이터의 도착을 보장하지 않으며, 수신 여부를 확인하지 않는다
- 단순성
- 헤더가 간단하여 오버헤드가 적음
- 연결 설정 과정이 없으므로 지연 시간이 적음
- 장점
- 낮은 지연 시간 (low latency)
- 오버헤드가 적어 빠른 데이터 전송이 가능
- 실시간 응용 프로그램에 적합
- 단점
- 데이터 전송의 신뢰성과 순서를 보장하지 않음
- 손실된 데이터의 재전송을 보장하지 않음
- 사용 예시
- 실시간 스트리밍 (음성, 비디오)
- 온라인 게임
- DNS 조회
- 간단한 메시지 전달
- 비연결 지향적
- 간단한 비교 표
특성 | TCP | UDP |
연결 지향성 | 연결 지향적 | 비연결 지향적 |
신뢰성 | 신뢰성 있음 | 신뢰성 없음 |
흐름 제어 | 있음 | 없음 |
혼잡 제어 | 있음 | 없음 |
오버헤드 | 높음 | 낮음 |
데이터 전송 순서 보장 | 있음 | 없음 |
사용 사례 | 웹 브라우징, 이메일, 파일전송, 원격 로그인 | 실시간 스트리밍, 온라인 게임, DNS 조회 |
3. Echo Server
- 클라이언트로부터 받은 메시지를 그래도 돌려주는 서버
- 동작 원리
- 클라이언트가 서버에 연결
- 클라이언트는 특정 IP 주소와 포트를 통해 서버에 연결을 시도
- 서버가 클라이언트의 연결을 수락
- 서버는 클라이언트의 연결 요청을 수락
- 데이터 수신 및 전송
- 클라이언트가 서버에 데이터를 전송
- 서버는 해당 데이터를 수신한 후 그대로 클라리언트에게 다시 전송
- 연결 유지 또는 종료
- 이 과정은 클라리언트가 연결을 종료할 때 까지 반복
- 클라이언트 또는 서버가 연결을 종료하면, 서버는 다른 클라이언트의 연결 요청을 기다린다.
- 클라이언트가 서버에 연결
4. BroadCast와 UniCast
>네트워크 통신에서 데이터를 전송하는 두 가지 주요 방식, 데이터가 전송되는 대상과 범위에 따라 구분된다.
- Broadcast
- 네트워크 상의 모든 장치에게 데이터를 전송하는 방식
- 특정한 대상 없이 네트워크에 연결된 모든 장치가 동일한 데이터를 받는다.
- 특징
- 범위: 동일한 네트워크 세그먼트 내의 모든 장치가 데이터를 수신
- 목적: 일반적으로 네트워크 구성 요소들이 서로를 식별하거나 설정 정보를 전달할 때 사용
- 주소: IPv4의 경우, 일반적으로 255.255.255.255 또는 서브넷의 브로드캐스트 주소(예: 192.168.1.255)가 사용
- 사용 사례
- ARP (Address Resolution Protocol): IP 주소를 MAC 주소로 변환하기 위해 사용됩니다.
- DHCP (Dynamic Host Configuration Protocol): 클라이언트가 IP 주소를 요청할 때 사용됩니다.
- 장단점
- 장점: 모든 장치에게 빠르게 정보를 전달할 수 있습니다.
- 단점: 네트워크 트래픽이 증가하고, 네트워크 대역폭을 많이 사용하게 됩니다.
- Unicast
- 네트워크 상의 특정한 하나의 장치에게 데이터를 전송하는 방식
- 송신자와 수신자가 명확히 구분되어 있고, 데이터는 특정 수신자에게만 전달
- 특징
- 범위: 네트워크 내의 특정 장치 하나가 데이터를 수신합니다.
- 목적: 일반적인 1:1 통신에서 사용됩니다.
- 주소: 수신자의 IP 주소가 사용됩니다.
- 사용 사례
- 웹 브라우징: 웹 서버에서 클라이언트로 HTML 페이지를 전송할 때.
- 파일 전송: FTP 또는 다른 파일 전송 프로토콜에서 파일을 전송할 때.
- 장단점
- 장점: 네트워크 대역폭을 효율적으로 사용할 수 있습니다.
- 단점: 다수의 장치에 동일한 데이터를 전송할 때는 비효율적일 수 있습니다.
5. Socket과 Socket관리
- 네트워크 상의 두 노드 간 통신의 끝점(Endpoint)을 나타내는 추상화된 개념
- 네트워크 프로그래밍에서 소켓은 플라이언트와 서버가 데이터를 주고 받기 위해 사용하는 통신 채널
- 소켓의 종류
- 스트림 소켓
- TCP 프로토콜을 사용하여 신뢰성 있는 데이터 전송
- 연결 지향적이며 데이터의 순서보장
- 데이터그램 소켓
- UDP 프로토콜을 사용하여 비신뢰성 데이터 전송
- 연결 비지향적(연결 성정 불필요)이며, 데이터의 순서 비보장
- 스트림 소켓
- 소켓 통신의 기본 과정
- 소켓 생성 : `socket()` 함수를 사용하여 소켓 생성
- 주소 바인딩 :
- 연결 대기
- 연결 수락
- 데이터 송수신
- 연결 종료
const net = require('net');
// 서버 생성
const server = net.createServer((socket) => {
console.log('Client connected');
// 클라이언트로부터 데이터 수신
socket.on('data', (data) => {
console.log(`Received: ${data}`);
socket.write('Hello, client!'); // 클라이언트에게 응답
});
// 클라이언트 연결 종료
socket.on('end', () => {
console.log('Client disconnected');
});
// 에러 처리
socket.on('error', (err) => {
console.error(`Socket error: ${err}`);
});
});
// 서버 바인딩 및 리스닝
server.listen(8080, '0.0.0.0', () => {
console.log('Server is listening on port 8080');
});
// 서버 에러 처리
server.on('error', (err) => {
console.error(`Server error: ${err}`);
});
- 소켓 관리
- 소켓의 생성, 유지, 모니터링, 종료와 관련된 모든 작업을 포함
- 효율적인 소켓 관리는 네트워크 애플리케이션의 성능과 안정성을 보장하는데 중요
- 주요 소켓 관리 작업
- 소켓 설정 및 초기화
- 비동기 소켓 관리
- 다중 소켓 관리
- 연결 수명 주기 관리
- 에러 처리