TCP / IP
- 컴퓨터 네트워크에서 데이터 통신을 위한 프로토콜 스택으로, 네트워크 간의 데이터 교환을 가능하게 하는 기술
- 데이터를 분할하여 보냄
- 정확한 전송을 보장하며 데이터의 경로를 지정하는 역할
TCP
- Transmission Control Protocol
- 데이터를 신뢰성 있게 전송하기 위한 프로토콜
- TCP 통신은 컨테이너 벨트를 생각하면 됨
- 신뢰성 : 데이터의 손실이나 손상을 최소화하고, 데이터의 순서를 보장
- 연결 지향 : 데이터를 주고받기 전에 송신자와 수신자 연결 ⭕
- 흐름 제어 : 데이터의 흐름을 제어하여 수신자가 처리할 수 있는 속도에 맞춰 데이터 전송
- 혼잡 제어 : 네트워크의 혼잡 상태를 감지하고 조절하여 네트워크 성능을 유지
IP
- Internet Protocol
- 인터넷 상에서 데이터를 주고받기 위한 통신 규약
- 패킷 기반 : 데이터를 작은 패킷 단위로 나누어 전송하고, 각 패킷은 목적지 주소와 출발지 주소 정보를 포함
- 비연결성 : 패킷은 독립적으로 처리되며, 수신자와의 직접적인 연결이 필요 ❌
- 라우팅 : 각 라우터가 패킷의 경로를 결정하여 목적지까지 전달
- IP 주소 : IP는 각 컴퓨터를 식별하기 위한 IP 주소 사용
TCP/IP 4계층
- Application Layer
- Transport Layer
- Internet Layer
- Network Interface
OSI 7계층
- Application Layer
- Presentation Layer
- Session Layer
- Transport Layer
- Network Layer
- Data Link Layer
- Physical Layer
네트워크 인터페이스 계층
- Network Interface Layer / Network Access Layer
- OSI 7계층의 물리 계층 & 데이터 링크 계층
- 물리적인 네트워크와 상호 작용
- 데이터를 전기 신호로 변환하거나 광 신호로 변환하여 전송
- 데이터를 프레임으로 나누어 전송하고, 프레임을 수신하여 물리적인 신호로 변환
- 수신된 프레임에서 오류 검출
- 맥 (Media Access Control) 주소 관리
- 이더넷이나 와이파이 같은 기술이 이 계층에 해당
인터넷 계층
- Internet Layer
- OSI 7계층의 네트워크 계층
- 데이터 패킷의 라우팅과 논리적인 주소 지정을 담당
- IP 프로토콜이 작동하는 계층
- 패킷의 출발지와 목적지 IP 주소를 사용하여 라우팅 수행
- IP 주소와 관련된 서비스인 ARP (Address Resolution Protocol) 와 같은 프로토콜도 이 계층에서 동작
전송 계층
- Transport Layer
- OSI 7계층의 전송 계층
- 데이터의 신뢰성과 흐름 제어 관리
- TCP와 UDP가 이 계층에서 작동
응용 계층
- Application Layer
- OSI 7계층의 세션 계층, 표현 계층, 응용 계층
- 최종 사용자에게 서비스를 제공하기 위한 응용 프로그램 & 사용자 인터페이스가 이 계층에 위치
- 다양한 프로토콜을 포함하며, HTTP, FTP, SMTP, POP3, IMAP, DNS 등의 프로토콜이 이 계층에서 동작
- 각 프로토콜은 특정한 응용 서비스를 제공하기 위한 목적으로 사용
UDP
- User Datagram Protocol
- 비연결성 프로토콜
- 데이터의 신뢰성은 낮지만, 속도가 빠르고 간편함
- 데이터그램 단위로 데이터를 전송하며, 순서 및 데이터 신뢰성 보장 ❌
- 데이터 전송에 관련된 작업이 단순함
- 흐름 제어나 혼잡 제어 메커니즘 ❌ → 오버헤드 ↓
- VOIP, 스트리밍, 온라인 게임 등에서 데이터 전송이 빈번하게 발생하는 경우에 사용
소켓
- 프로세스가 네트워크로 데이터를 내보내거나 데이터를 받기 위한 실제적인 창구 역할을 하는 것

- 서버와 클라이언트를 연결해주는 도구로서 인터페이스 역할을 하는 것
- 서버 : 클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성해 통신을 가능하게 함
- 클라이언트 : 실제로 데이터 송수신이 일어나는 곳
- 소켓은 프로토콜, IP 주소, 포트 넘버로 정의됨
- 응용 계층과 전송 계층 사이에서 동작
- TCP / UDP 프로토콜을 사용하여 데이터를 전송
소켓 프로그래밍
- 서버 소켓
- 연결 요청을 받아들이는 역할
- 클라이언트의 요청을 받아들여 실제 통신을 위한 소켓 생성
- 클라이언트 소켓
- 서버에 연결을 요청하고, 연결이 수락되면 서버와 데이터를 주고받을 수 있는 소켓
- 포트
- 컴퓨터 내에서 소프트웨어 간에 통신을 할 때, 사용되는 식별자
- 포트를 이용하여 특정 소켓을 찾고 연결
소켓 프로그래밍 흐름

- 서버
- socket( ) : 소켓 생성
- bind( ) : IP와 포트 번호 설정
- listen( ) : 클라이언트의 요청에 수신 대기열을 만듦
- accept( ) : 클라이언트와의 연결을 기다림
- close( ) : 소켓 닫음
- 클라이언트
- socket( ) : 소켓을 엶
- connect( ) : 통신할 서버의 설정된 IP와 포트 번호에 통신을 시도
- 통신 시도 시, 서버가 accept( )를 이용해 클라이언트의 socket descriptor를 반환
- socket descriptor를 통해 요청을 보낸 클라이언트가 누군지 서버가 구분할 수 있음
- 클라이언트와 서버가 서로 read( ), write( )를 반복하며 통신
WebSocket
- 양방향 통신을 위한 프로토콜
- HTML5 웹 표준 기술
- 빠르게 작동하며, 통신할 때 아주 적은 데이터를 이용
- 이벤트를 단순히 듣고, 보내는 것만 가능
- Handshake : 클라이언트가 서버로 웹소켓 연결을 요청할 때, 서버와 클라이언트 간의 초기 핸드셰이크가 이루어지며, 이 과정을 통해 웹소켓 연결
- 클라이언트에서는 브라우저의 웹소켓 객체를 사용하여 웹소켓 연결을 생성하고 관리
- 브라우저의 웹소켓 객체를 사용하여 웹소켓 연결을 생성하고 관리 = frontend에서만 웹소켓을 연결하여 사용할 수 있다
- 브라우저로 접속할 때마다 새로운 웹 소켓 하나씩 생성됨
HTTP vs WebSocket

WebSocket 이벤트
- open : 웹소켓 연결이 성공적으로 열림
- message : 웹소켓을 통해 데이터를 주고받음
- error : 웹소켓 연결 중 오류가 발생함 (연결 실패, 통신 오류 등)
- close : 웹소켓 연결이 종료됨
클라이언트
const socket = new WebSocket("ws://localhost:8000");
socket.addEventListner("open", (event) => {
console.log("서버에 연결되었습니다.");
});
socket.addEventListner("message", (event) => {
console.log(`서버로부터 받은 메시지: ${event.data}`);
});
socket.addEventListner("error", (event) => {
console.error("오류가 발생했습니다:", event.error);
});
socket.addEventListner("close", (event) => {
console.log("서버와 연결이 종료되었습니다.");
});
- ws : 웹소켓
- 웹소켓 객체를 생성하면서 접속할 경로를 명시
백엔드
- 브라우저에서는 웹소켓 API를 사용하여 웹소켓 클라이언트를 만들 수 있음
- 백엔드에서는 별도의 라이브러리나 모듈을 설치해야 사용 가능
npm i ws
const ws = require("ws");
const PORT = 8080;
const wss = new ws.Server({ port: PORT });
wss.on("connection", (socket) => {
console.log("클라이언트가 연결되었습니다.");
socket.on("message", (message) => {
console.log(`클라이언트로부터 받은 메시지: ${message}`);
socket.send(`서버에서 받은 메시지: ${message}`);
});
socket.on("error", (error) => {
console.error("오류가 발생했습니다:", error);
});
socket.on("close", () => {
console.log("클라이언트와 연결이 종료되었습니다.");
});
});
- wss.on의 socket : 브라우저의 소켓
ws 모듈 이벤트
- connection : 클라이언트가 웹소켓 서버에 연결됨. 이 이벤트의 콜백 함수는 새로운 클라이언트 연결마다 실행
- message : 클라이언트로부터 메시지를 받음
- error : 웹소켓 연결 중 오류가 발생함
- close : 클라이언트와의 연결이 종료됨
JSON
- 서버는 Node.js, c++, 파이썬, 자바 등 다양
- 다양한 객체들을 하나로 통합하여 처리하기 위해 JSON 방식 사용
- 따라서 서버로 보낼 때 객체로 보내야 하고, 객체는 string 형태여야 함 (어느 서버에서 어떻게 데이터를 보낼지 알 수 없기 때문에 문자열로 통일시켜 서버로 전송함)
- json.stringify
- json.parse 정리하기
웹소켓 통신에서의 데이터 형태
- 웹소켓을 통해 클라이언트와 서버 간에 데이터를 주고받을 때에는 일반적으로 문자열 또는 buffer 형태로 전달됨
- buffer를 사용하는 이유 : 서버가 모두 다른 환경이기 때문에 객체를 전달할 때에는 객체를 일련의 바이트로 변환하는 직렬화 과정이 필요함