글을 쓰기에 앞서 소켓이란 해당 식별자를 가지는 열린 파일이라는 것을 알아두고 가자.
Host
IT 분야에서는 호스트란 네트워크에 연결되어 있는 컴퓨터들이다. 인터넷은 TCP/IP 프로토콜을 이용하여 통신을 하는데, 통신을 하려고 해도 목적지와 출발지가 없으면 어디로 데이터를 보낼지 받을지 모른다. 따라서 IP라는 고유한 주소를 통해 목적지와 출발지를 구할 수 있으며 , 이때 호스트는 IP 주소를 갖는다. 즉, 호스트는 IP를 가지고 있는 양방향 통신이 가능한 컴퓨터라는 점을 기억하자.
URL, URI
결론부터 말하면 URI는 자원의 위치이고, URL은 자원의 식별자이다. 쉽게 얘기하면 우리가 주소창에 입력하는 전체 주소는 사실 URL이 아니고 URI이다. 즉, URI가 더 큰 범주이고, URL은 그 범주안에 속한다.
socket
TCP/IP의 구현은 커널 수준에서 되어있다. 따라서 이를 user mode application에서 접근할 수 있도록 인터페이스를 제공하는 것을 socket이라고 한다. 따라서 기본적인 본질은 File이지만, 이때 프로토콜을 추상화했기 때문에 Socket이라고 한다. 즉, 정리하면 Socket이란 TCP라는 요소를 User mode application process가 접근할 수 있도록 추상화한 인터페이스이다.
글로벌 IP 인터넷
Global IP Internet이란 가장 유명한 internet의 예시이다. 즉, 우리가 사용하는 그 인터넷을 의미한다. 이는 Wired, Wireless에 상관없이 Worldwide Computer의 Connection이다.
이렇게 인터넷 클라이언트와 서버는 연결을 통해서 바이트 스트림을 주고받는 방식으로 통신한다. 여기서 바이트 스트림이란 1바이트를 입출력할 수 있는 스트림을 의미한다. 그럼 여기서 '연결'이라는 단어에 초점을 맞춰보자.
- 연결은 2개의 프로세스를 연결한다는 점에서 point-to-point 연결이다.
- 연결은 데이터가 동시에 양방향으로 흐를 수 있다는 점에서 full-duplex이다.
- 또한 보낸 것과 동일한 순서로 수신된다는 특징을 가진다.
그리고 여기서 socket은 연결의 종단점(end point of a connection)을 의미하고, 소켓주소는 address(인터넷 주소) : port(16비트 정수 포트)로 구성된다. 따라서 연결은 두 개의 종단점의 소켓 주소에 의해서 유일하게 식별된다. 정리하면 다음과 같다.
- 두 개의 소켓 주소를 소켓 쌍(tuple)이라고 한다.
- (client_addr: client_port, server_address, server_port)
또한 Global IP Internet은 TCP/IP Protocol Family를 기반으로 한다. 여기서 TCP/IP Protocol Family라는 것은 TCP, IP, UDP를 묶은 것을 의미한다.
- IP(Internet Protocol) : Host 식별을 위한 Naming Scheme(Host Address)를 제공한다. 이때, Host 간의 불안정한 Data Packet Delivery를 제공하기 때문에 데이터 손실을 막지 못하며, Duplicate Packet 문제도 해결하지 못한다.
- UDP(Unreliable Datagram Protocol) : IP 프로토콜을 활용한 형태로 여전히 Unreliable하다. 즉, IP를 이용해 process 간의 불안정한 Packet Delivery를 제공하기 때문에 불안정하긴 하지만 속도는 굉장히 빠르다. 따라서 UDP는 데이터 패킷이 손실되어도 크게 문제되지 않는 상황에서 유용하게 사용될 수 있다.
- TCP(Transmission Control Protocol) : IP를 이용해 Connection을 가진 process 간의 reliable byte stream을 제공한다. 따라서 TCP 프로토콜은 데이터 패킷이 사라지지 않고, 전달 순서도 보장되며, Duplicate도 제거한다.
이 세가지 프로토콜을 합쳐서 TCP/IP Family라고 하며, Global IP Internet이 바로 이 세가지 프로토콜을 기준으로 구축된 것이다.
핵심은 Global IP Internet은 Application 입장에서 Socket Interface에 있는 UNIX File I/O 함수들을 통해 접근할 수 있다는 점을 기억하자.
Internet Application Structure
Network Adapter는 하드웨어이다. 따라서 각각의 Host Device에 붙어있다. 그리고 이 안에는 Embedded Software인 Firmware가 존재한다. 그리고 이 Network Adapter와 Firmware는 물리적인 전송을 수행한다.
OS Kernel 안에는 TCP/IP Protocol 소프트웨어가 존재한다. 그리고 Host의 Application에는 OS Kernet 내의 Protocol을 사용하기 위해서 System Call을 호출한다. 이때, Socket을 사용할 수 있는 Interface가 제공되는데, 이를 Socket Interface라고 한다. 이 Socket Interface의 내부는 UNIX File I/O로 구성된다.
마지막으로 네트워크 통신은 I/O이기때문에 비동적인 interrupt 방식이라는 것을 기억하자. 즉, 서버가 네트워크를 통해 데이터를 받으면, 이를 Interrupt 방식으로 커널에게 알린다. 그리고 Network Adapter가 직접 이 메시지를 보내고, 이 interrupt를 커널내의 protocol이 수신한다. 마지막으로 protocol은 데이터를 받았다는 사실을 Host에게 알린다.
소켓 인터페이스
그럼 socket interface란 무엇일까? The socket interface is a set of functions that are used in conjunction with the Unix I/O functions to build network applications. 즉, 소켓 인터페이스란 네트워트 응용 프로그램을 만들기 위한 Unix I/O 함수들과 함께 사용되는 함수들의 집합인 것이다.
즉, TCP/IP 스택에서 애플리케이션은 시스템의 기능을 함부로 쓸 순 없는 상태이다. 대신에 시스템은 애플리케이션이 네트워크 기능을 사용할 수 있도록 프로그래밍 인터페이스를 제공하는데 이를 socket이라고 한다. 따라서 애플리케이션은 socket을 통해서 데이터를 주고 받는다. 여기서 개발자는 socket programming을 통해서 네트워크 상에서 다른 프로세스와 데이터를 주고 받을 수 있도록 구현할 수 있다.
정리하면 대부분의 시스템은 socket 형태로 네트워크 기능을 제공한다. 하지만 보통 개발자가 socket을 직접 조작해서 통신 기능을 구현할 일은 적다. 그래서 application layer의 프로토콜은 보통 라이브러리나 모듈 형태로 해당 기능을 제공하고, 이 내부를 열어보면 결국 socket을 활용해서 프로토콜을 구현했음을 알 수 있게된다.
그럼 실제 구현 및 동작 관점에서 socket을 살펴보자. 우선 port number가 socket을 식별하기 위해 부여되는 숫자라는 것을 알아야 한다. 그리고 최종적으로 socket은 <protocol, IP address, port number>로 정의된다.
그런데 프로토콜 표준에서 정의한 것처럼 socke이 저 형태로 unique하게 식별되냐고 질문하면, 프로토콜 스펙을 시스템 레벨에서 구현하면서 조금 달라진다고 말할 수 있다. 즉, UDP같은 경우는 IP address와 port number로 unique하게 식별이 되지만, TCP의 경우에는 그렇지 않다. 그럼 TCP socket의 동작 방식이 어떤지 한번 알아보자.
TCP socket 동작 방식
다음과 같이 클라이언트와 서버간에 TCP 3-way handshake 과정이 일어난 후에 서버측에는 IP address와 port number가 모두 동일한 소켓이 만들어진다. 그럼 여기서 어떻게 socket을 식별하는지 궁금증이 생길 수 있다. 이에 대한 답은 connection 연결 요청시에는 listening socket으로 연결이 이루어지고, connection이 성립된 이후에는 source의 ip와 port가 포함된 <src IP, src port, dest IP, dest port>로 socket을 식별한다. 결국 핵심은 실제 구현에서는 TCP socket은 <IP, port>만으로는 unique하게 식별할 수 없다는 것을 인지하자.
UDP socket 동작 방식
반면에 UDP는 Connection이 없고, 아래 그림과 같이 IP address와 port만으로 소켓을 식별할 수 있다. 그래서 소켓 하나만을 사용하기 때문에 UPD socket에서 데이터를 보낼 때, 어느 UDP socket으로 보낼지 지정할 수 있고, UDP socket에서 데이터를 읽을 때는 어느 UDP socket으로부터 왔는지도 알 수 있다.
Port number
port number는 16 bits로 이루어진 숫자를 의미하고, 그 범위는 0 ~ 65535번 까지 이다.
- 0 ~ 1023 : well-known ports, system ports라고 하며, 예로는 HTTP(80), HTTPS(443), DNS(53) 등이 있다.
- 1024 ~ 49151 : registered ports로 IANA에 등록된 번호이다. 예로는 MySQL DB(3306), Apache tomcat server(8080) 등이 있다.
- 49152 ~ 65535 : dynamic ports로 등록이 안된 번호로 사용되며, 임시로 혹은 OS에 의해서 자동 할당될 때 사용된다.
표준과 실제 동작의 비교 정리
인용
https://www.youtube.com/watch?v=WwseO8l8rZc&t=14s&ab_channel=%EC%89%AC%EC%9A%B4%EC%BD%94%EB%93%9C
'책 - 요약 정리 > CSAPP' 카테고리의 다른 글
Virtual Memory (0) | 2023.11.08 |
---|---|
Exceptional Control Flow (0) | 2023.11.07 |
linking (0) | 2023.11.07 |
CSAPP - Procedures (1) | 2023.11.01 |