이번 학기 네트워크 프로그래밍에서는 유닉스, C언어, TCP/IP 환경에서 소켓 통신을 공부했다.
공부한 내용을 복기해보며 정리한 내용이다.
TCP/IP
TCP/IP 프로토콜
- 패킷 통신 방식의 인터넷 프로토콜인 IP와 전송 조절 프로토콜인 TCP를 기반으로 사용하는 인터넷 통신 프로토콜들을 의미한다.
- 운영체제의 일부로 구현되며, 응용 프로그램은 운영체제가 제공하는 TCP/IP 프로토콜을 통해 통신을 수행한다.
계층 구조

각 계층에서의 역할
- 네트워크 엑세스 계층
- 물리적 네트워크를 통한 데이터 송수신
- 이더넷 48bit 물리주소 사용
- 인터넷 계층
- 네트워크 엑세스 계층의 도움을 받아 목적지 호스트까지 데이터를 전송
- IP주소 사용 (소프트웨어적으로 정의된 논리주소)
- 라우팅(데이터를 목적지까지 전달하는 일련 작업, 라우팅 정보를 기초로 데이터 전달)
- 전송 계층
- 최종 통신 목적지(응용 프로그램)을 지정하고 데이터 손실,손상 등의 전송 오류 없이 데이터를 전송하는 역할
- 포트 번호 사용
- TCP(연결형, 신뢰할 수 있는 통신, 일대일 통신, 데이터 경계 구분 안 함(바이트 스트림))
- UDP(비연결형, 신뢰할 수 없음, 일대일/일대다 통신, 데이터 경계 구분 함(데이터그램))
인터넷에서 데이터 전송 원리
패킷(Packet)
- 크게 각 프로토콜에서 정의한 제어 정보(IP 주소, 포트번호, 오류 검출 코드 등) + 데이터로 나뉜다.
- 제어 정보는 패킷의 앞에 붙는 패킷 헤더(header)와 뒤쪽에 붙는 트레일러(Trailer)로 구분된다.
패킷 송신/수신
- 송신측은 TCP/IP 계층의 응용 계층부터 네트워크 엑세스 계층까지 내려가면서 각 계층의 프로토콜에 필요한 헤더나 트레일러를 덭붙인다.(캡슐화)
- 수신측은 반대로 낮은 계층부터 상위 계층까지 올라가면서 각 계층의 헤더/트레일러를 처리하고 상위 계층으로 전달한다.(역캡슐화)
송신측:
수신측:
소켓(Socket)
- 소켓은 인터넷 상에서 두 프로그램(클라이언트, 서버)이 데이터를 송수신하기 위한 통신 종단점이다.
데이터 타입 관점
- 소켓은 데이터 타입 관점에서 파일 디스크립터나 핸들과 유사한 개념이라 할 수 있다.
- 생성과 설정을 하고 난 후에 운영체제의 통신 관련 정보를 참조해 다양한 통신 기능을 편리하게 사용할 수 있는 데이터 타입이다.
int fd = open("myfile", ...);
read(fd, ...);
write(fd, ...);
SOCKET sock = socket(...);
recv(sock, ...);
send(sock, ..._);
네트워크 프로그래밍 인터페이스 관점
- 소켓은 응용 계층과 네트워크 계층(전송 계층, 인터넷 계층, 네트워크 엑세스 계층) 사이에 위치하는 것으로 간주된다.
- 응용 프로그램은 네트워크 프르토콜의 세부사항을 몰라도 소켓이 제공하는 기능(send(), recv() 등)들을 사용하여 간단하게 네트워크 프로토콜들을 거쳐 상대방과 통신할 수 있다.
