이석복 교수님의 컴퓨터네트워크 강의를 듣고 정리하였습니다.
Application Layer
- TCP/IP 5계층 모델에서 가장 상위 Layer를 담당한다.
- Transport/Network/Link/Physical Layer는 모두 운영체제에 구현
- 방식 2가지
- Client-Server
- Client: 서비스를 제공받는 호스트
- Server: 서비스를 제공하는 호스트
- 중앙 집중된 서버가 존재
- 클라이언트 수가 증가하면 네트워크 부하가 발생
- 중앙 집중적으로 관리되므로 접근 허가/제한에 용이함
- 서버 구축 비용이 많이 든다.
- 서버가 다운될 경우 연결된 클라이언트들은 서비스를 모두 서비스를 제공받을 수 없게 된다.
- P2P(Peer-to-Peer)
- 컴퓨터 간의 양방향 파일 전송 시스템
- 중앙 서버 없이 각각의 컴퓨터가 서버와 클라이언트가 된다.
- 모든 단말이 동일하고 특별한 기능과 역할을 가진 단말이 존재하지 않는다.
- 사용자 수가 방대해져도 특정 단말에 부하가 집중되지 않는다 -> 확장성
- 설치와 관리가 간편하고 고가의 서버 등을 구입할 필요가 없다.
- 구축에 많은 비용이 소모되지 않음
- 데이터가 여러 컴퓨터에 흩어져 있어 백업 작업이 복잡하다.
- 새로운 기능 추가나 업데이트 관리가 어렵다.
- Client-Server
Socket
- 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다(endpoint).
- 구성 요소 5가지
- 인터넷 프로토콜(TCP, UDP)
- 로컬 IP 주소
- 로컬 port
- 원격 IP 주소
- 원격 port
- 소켓은 크게 두 개 타입으로 분류할 수 있다.
- TCP 프로토콜을 사용하는 경우
- UDP 프로토콜을 사용하는 경우
- 어플리케이션 계층(Application Layer)에 존재하는 네트워크 응용 프로그램들은 데이터를 송수신 하기 위해 소켓을 거쳐 전송 계층(Transport Layer)의 통신 망으로 전달한다.
- 즉, 운영체제의 핵심인 커널에 어플리케이션에서 생성되는 메시지를 전달해주는 과정에서 socket이 활용된다.
- application layer와 transport layer 사이에 위치
(사진 출처: 티스토리)
Socket 프로그래밍
- Socket 연결은 TCP/IP 프로토콜을 기반으로 맺어진 네트워크 연결 방식
- 이러한 Socket 연결 방식으로 프로그래밍 하는 것이 소켓 프로그래밍
- Server와 Client가 특정 Port를 통해 연결을 유지하며 실시간으로 양방향 통신을 하는 방식
- HTTP 프로그래밍과의 차이
- Socket 프로그래밍은 Server 역시 Client로 요청을 보낼 수 있으며, 계속 연결을 유지하는 연결지향형 방식이기 때문에 실시간 통신이 필요한 경우에 자주 사용
- 실시간 양방향 통신 vs 요청이 있을 때만 클라이언트에서 서버로의 일회성 단방향 통신
- 실시간 채팅이나 동영상 스트리밍 서비스, 온라인 게임 등에 사용
- HTTP 프로그래밍을 사용한다면?
- 실시간 채팅의 경우 HTTP 프로그래밍으로 구현 자체가 불가능. 송신은 가능하지만 수신자가 실시간으로 연결되어 있지 않기 때문
- 동영상 스트리밍 서비스의 경우 동영상이 종료되는 순간까지 계속해서 HTTP 요청을 보내야 하기 때문에 서버에 많은 부하가 발생
- Socket을 사용하는 것이 적합
- HTTP 프로그래밍을 사용한다면?
HTTP 프로그래밍
- 기본적으로 소켓 연결 위에서 맺어지는 어플리케이션 계층의 연결 방식
- http도 소켓 위에서 동작한다.
- Client의 요청(Request)이 있을 때만 Server가 응답(Response)하여 해당 정보를 전송하고 곧바로 연결을 종료하는 방식
- 실시간 연결이 아닌, 필요한 경우에만 Server로 접근하는 콘텐츠 위주의 데이터를 사용할 때 용이하다.
- 필요한 경우에만 Server로 정보를 요청하는 경우가 많다. Web Server에서 Http 프로그래밍 방식을 주로 사용하며 비용 및 유지보수 등 대부분의 방면에서 좋다.
소켓 통신의 흐름
(사진 출처: 티스토리)
socket()
int socket(int domain, int type, int protocol);
- 소켓을 생성한다.
- 소켓 역시 파일로 이루어져있기 때문에 파일 디스크립터를 반환한다.
- 소켓을 여는데 실패했다면 -1을 반환한다.
- 3가지 인자
- domain: 프로토콜 패밀리 지정()
- - PF_INET : 인터넷 프로토콜 (TCP/IP를 사용하기 위해 기본적으로 인터넷 프로토콜 지정)- PF_UNIX : 유닉스 방식 프로토콜- PF_PACKET : 리눅스에서 패킷 캡쳐를 위해 사용
- - PF_NS : 제록스 네트워크 시스템의 프로토콜
- - PF_INET6 : IENT IPv6 프로토콜
- type: 프로토콜에 따라 3가지 방식
- TCP
- UDP
- raw (TCP나 UDP를 거치지 않고 바로 IP 계층 사용 시)
- protocol: 소켓에서 사용할 프로토콜
- protocol : 소켓에서 사용할 프로토콜- IPPROTO_UDP : UDP 방식
- - 0 : type에서 미리 정해진 경우 써도 됨
- - IPPROTO_TCP : TCP 방식
- domain: 프로토콜 패밀리 지정()
bind()
int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen);
- 소켓에 주소를 할당한다.
- 3가지 인자
- sockfd: socket() 함수를 통해 배정받은 파일 디스크립터 번호
- *addr: IP주소와 port번호를 담은 구조체
- addrlen: addr 변수의 길이
listen()
int listen(int sock, int backlog);
- 연결 요청을 대기한다.
- 2가지 인자
- sock: 소켓 디스크립터 번호
- backlog: 연결 요청을 대기하는 큐의 크기
connect()
int connect(int fd, struct sockaddr *remote_host, socklen_t addr_length)
- 서버 소켓에 연결을 요청하는 함수
- 3가지 인자
- fd: 소켓 디스크립터 번호
- sockaddr: 원격 호스트의 주소 정보를 담음(IP주소, Port번호)
- addr_length: sockaddr 변수의 길이
accept()
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
- 클라이언트 소켓의 연결 요청을 수락한다.
- 3가지 인자
- sock: 서버 소켓(리스닝 소켓)의 디스크립터 번호
- *addr: 대기 큐를 참조해서 얻은 클라이언트의 주소 정보
- addrlen: addr 변수의 길이
send()
ssize_t send(int sockfd, const void * buf, size_t nbytes, int flags);
- 연결된 소켓을 통해서 데이터를 보낸다.
- 4가지 인자
- sockfd: 데이터를 보낼 연결 상태의 소켓
- buf: 전송할 데이터를 저장한 버퍼의 주소 값
- nbytes: 전송할 바이트 수
- flags: 데이터 전송 시 적용할 다양한 옵션 정보
recv()
ssize_t recv(int sockfd, void * buf, sizt_t nbytes, int flags);
- 연결된 소켓을 통해서 데이터를 받는다.
- 4가지 인자
- sockfd: 데이터를 수신할 연결 상태의 소켓
- buf: 수신된 데이터를 저장할 버퍼의 주소 값
- nbytes: 수신할 수 있는 최대 바이트 수
- flags: 데이터 수신 시 적용할 다양한 옵션 정보
close()
- 데이터 송수신을 완료한 후 소켓을 소멸시킨다.
- 커널이 해당 소켓의 자원을 모두 시스템에서 제거한다.
참고
https://mangkyu.tistory.com/48
https://reakwon.tistory.com/81
'Computer Science > 📡Network' 카테고리의 다른 글
Network Edge: Access와 Link를 중심으로 (0) | 2022.04.09 |
---|---|
인터넷을 정의하는 다양한 관점, 그리고 프로토콜 (0) | 2022.04.08 |
[Network] 네트워크 기본 - 3 (0) | 2021.11.14 |
[Network] 네트워크 기본 - 2 (0) | 2021.11.12 |
[Network] 네트워크 기본 - 1 (0) | 2021.11.05 |