Network Programming: 두 판 사이의 차이
| 197번째 줄: | 197번째 줄: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<code>sa_family</code>는 어떤 종류의 주소인지 구분(AF_INET: IPv4, AF_UNIX: 유닉스 도메인 등)하며, <code>sa_data</code>는 실제 주소(예: IP, 포트 등)가 들어가며 내용은 프로토콜마다 달라진다. 해당 구조체의 메모리 구조는 Figure 10과 같다.<br> | <code>sa_family</code>는 어떤 종류의 주소인지 구분(AF_INET: IPv4, AF_UNIX: 유닉스 도메인 등)하며, <code>sa_data</code>는 실제 주소(예: IP, 포트 등)가 들어가며 내용은 프로토콜마다 달라진다. 해당 구조체의 메모리 구조는 Figure 10과 같다. | ||
<br> | |||
인터넷 전용 주소의 구조체는 <code>sockaddr_in</code>을 사용한다. | 인터넷 전용 주소의 구조체는 <code>sockaddr_in</code>을 사용한다. | ||
[[파일:Sockaddr in 구조체 메모리 구조.png|섬네일|Figure 11. sockaddr_in 구조체 메모리 구조]] | [[파일:Sockaddr in 구조체 메모리 구조.png|섬네일|Figure 11. sockaddr_in 구조체 메모리 구조]] | ||
2025년 5월 3일 (토) 07:45 판
개요
네트워크 애플리케이션은 컴퓨터 시스템의 많은 개념에 의존한다. 예를 들어, 프로세스(process), 시그널(signal), 바이트 순서(byte ordering), 메모리 매핑(memory mapping), 동적 저장소 할당(dynamic storage allocation) 등이 모두 중요한 역할을 한다. 또한 application layer에서의 개념, 클라이언트-서버(client-server) 구조 등에 대한 개념도 필요하다. 즉, 네트워크 프로그래밍은 네트워크 그 자체는 물론, 컴퓨터 시스템과도 땔려야 떌 수 없는 사이이다. 이 모델에서는, 하나의 애플리케이션이 서버 프로세스(server process)와 하나 이상의 클라이언트 프로세스(client process)로 구성된다.
The Client-Server Programming Model
거의 모든 네트워크 애플리케이션은 클라이언트-서버 모델에 기반한다. 이 모델에서는, 하나의 애플리케이션이 서버 프로세스(server process)와 하나 이상의 클라이언트 프로세스(client process)로 구성된다. 서버는 어떤 자원(resource)을 관리하고, 이 자원을 적절히 다루어서 클라이언트에게 서비스를 제공한다. Figure 1에 나타나 있듯이, 클라이언트-서버 모델에서 기본적인 동작은 트랜잭션(transaction)이다. 이는 다음의 네 단계로 구성된다:

- 클라이언트가 트랜잭션을 시작하기 위해[1] 서버에 요청(request)을 보낸다.
- 예를 들어, 웹 브라우저가 파일을 필요로 할 때, 웹 서버에 요청을 보낸다.
- 서버는 요청을 수신하고(receive), 이를 해석하고(interpret), 적절한 방식으로 자원을 조작(manipulate)한다.
- 예를 들어, 웹 서버가 브라우저로부터 요청을 받으면, 디스크 파일을 읽는다.
- 서버는 클라이언트에게 응답(response)을 보낸 다음, 다음 요청을 기다린다.
- 예를 들어, 웹 서버는 파일을 클라이언트에게 전송한다.
- 클라이언트는 응답을 수신하고, 이를 사용한다.
- 예를 들어, 웹 브라우저가 서버로부터 페이지를 수신한 후, 이를 화면에 표시한다.
이때 주의할 점은, 클라이언트와 서버는 프로세스이지, 호스트(host), 즉 실체적인 기계가 아니라는 것이다. 하나의 호스트는 서로 다른 여러 클라이언트와 서버를 동시에 실행할 수 있으며, 클라이언트와 서버 간의 트랜잭션은 동일한 호스트 내에서 일어날 수도, 서로 다른 호스트에서 일어날 수도 있다.
Hardware organization of a network host

Figure 2는 호스트가 어떻게 하드웨어적으로 구성되어 있는지를 보여준다.
- CPU chip
- 내부에 레지스터 파일(Register file)과 ALU(Arithmetic Logic Unit, 산술논리연산장치)가 있다.
- Bus interface를 통해 시스템의 다른 부분과 연결된다.
- System bus를 통해 CPU는 외부의 I/O bridge로 데이터를 주고받는다.
- I/O bridge
- 시스템의 중심적인 연결 지점이며, System bus 와 Memory bus, 그리고 I/O bus 사이를 연결해주는 다리 역할을 한다.
- CPU와 메인 메모리 및 다양한 주변장치들 간의 데이터 흐름을 조정한다.
- Main memory
- Memory bus 를 통해 I/O bridge에 연결되며, CPU가 직접 읽고 쓰는 기본적인 저장공간이다.
- 네트워크로부터 수신된 데이터나, 네트워크로 보낼 데이터도 여기에 저장된다.
- I/O bus: 다양한 입출력 장치들을 연결하는 버스이며, I/O bridge를 거쳐 CPU 및 메모리와 통신한다.
- USB controller: 마우스나 키보드 같은 장치를 USB를 통해 연결하고 제어한다.
- Graphics adapter: 모니터와 연결되어 화면 출력(Display)을 담당한다.
- Disk controller: 파일 시스템에 저장된 데이터에 접근하기 위해 하드디스크와 같은 저장장치를 제어한다.
- Expansion slots: 추가적인 장치를 설치할 수 있는 슬롯이며, 네트워크에 대한 물리적인 인터페이스(어댑터)를 제공한다.
- Network adapter: 네트워크와 직접 연결되는 하드웨어이며, 데이터가 이 어댑터를 통해 입출력된다.[2]
- Network: 외부의 다른 호스트들과 연결된 네트워크(예: LAN, WAN)를 의미하며, 호스트에게는 단지 데이터를 위한 입력과 출력을 제공하는 I/O 장치로 여겨진다.
Computer Networks
네트워크란, 지리적 근접성에 따라 조직된 상자(box)들과 선(wire)들의 계층적 시스템이다. 이때, 물리적인 근접성에 따라 다음과 같이 구분된다:

- SAN (System Area Network): 한 클러스터 또는 머신룸(서버실)을 연결하는 네트워크이다.
- 예: 스위치드 이더넷(Switched Ethernet), Quadrics QSW 등
- LAN (Local Area Network): 어떤 건물이나 캠퍼스 단위에 걸쳐 있는 네트워크이다.
- 가장 널리 사용되는 LAN 기술은 이더넷(Ethernet)이다.
- WAN (Wide Area Network): 나라 전체나 전 세계에 걸친 네트워크이다.[3]
인터넷(internet)은 여러개의 네트워크들을 상호 연결한 것이다. 또한 대중적으로 알려져 있는 Global IP Internet[4]은 인터넷[5]의 가장 일반적인 한 형태이다.

이더넷 세그먼트(segment)는 Figure 3와 같이 hub에 선(wire)으로 연결된[6] 여러 호스트들의 집합으로 구성된다. 이때 이더넷 세그먼트는 일반적으로 방 하나, 혹은 건물 한 층 정도의 작은 영역 정도의 크기이다. 한쪽 끝은 호스트의 어댑터에 연결되고 다른 쪽 끝은 허브의 포트에 연결뙨다. 이때, 허브는 자식이 각 포트에서 수신한 모든 비트를 다른 모든 포트로 반드시 송신(broadcast)한다. 각각의 이더넷 어탭터는 고유한[7] 48 비트의 MAC 주소[8]를 가지고 있다. 호스트는 세그먼트 상의 다른 어떤 호스트로든 프레임(frame)을 전송할 수 있다. 각 프레임은 헤더 필드와, 데이터(payload)로 구성된다. 모든 호스트 어댑터는 프레임을 수신하지만, 실제로 읽는 것은 목적지 호스트만이다.
각 이더넷 어댑터는 Figure 4와 같이 브리지(bridge)라고 불리는 작은 박스들과 선들을 이용해 더 큰 LAN인 브리지드 이더넷(bridged Ethernet)으로 확장될 수 있다. 브리지드 이더넷에서 어떤 선들은 브리지들 사이에서 연결되어 있고, 어떤 선들은 브리지를 허브에 연결한다. 이때 이 선들의 대역폭은 figure 4와 같이 다를 수 있다. 브리지는 허브보다 분산 알고리즘(distributed algorithm)을 사용해 어떤 포트에서 어떤 호스트로 도달할 수 있는지 학습한다. 그리고 필요할 때에만 프레임을 포트 사이에서 선택적으로 복사하여 대역폭을 더욱 효율적으로 사용한다. 예를 들어 호스트 A가 세그먼트 내의 호스트 B로 프레임을 보내면, 브리지 X는 입력 포트에서 프레임을 받자마자 이를 버리기 때문에 다른 세그먼트들의 대역폭이 절약된다. 그러나 호스트 A가 다른 세그먼트에 있는 호스트 C로 프레임을 보낼 경우, 브리지 X는 프레임을 브리지 Y와 연결된 포트로만 복사하고, 브리지 Y는 다시 이를 호스트 C가 연결된 포트로만 복사한다.

더 높은 수준의 layer에서는 서로 호환되지 않는 여러 LAN들을 라우터(router)라는 장비를 이용해 internet을 형성할 수 있다. 각 라우터는 자신이 연결된 각 네트워크 마다 하나의 포트를 가지고 있다. 이렇게 라우터를 통해 연결된 네트워크를 WAN이라고 한다. 이때, 인터넷은 라우터와 링크 대역폭(link capacity)이 제각각 다르므로, 특정한 구조로 정형화되어 있지 않다. 또한 송신측에서 수신측으로 보내는 패킷은 여러 경로를 통해 전달될 수 있다. Figure 5는 세 개의 라우터가 두개의 LAN과 WAN을 연결하여 구성된 하나의 인터넷 예시를 보여준다.
The Notion of an internet Protocol
인터넷의 핵심적인 특징은, 근본적으로 매우 다르고 서로 호환되지 않는 기술을 사용하는 LAN과 WAN들을 하나의 인터넷으로 통합할 수 있다는 점이다. 이러한 특징을 구현하기 위해서는 각 호스트와 라우터 내에 있는 프로토콜 소프트웨어(protocol software)를 활용해야 한다. 프로토콜이란 네트워크 사이의 데이터를 전송할 때, 호스트와 라우터가 어떻게 동작(협력)할지를 규정하는 규칙의 집합이다. 프로토콜은 네트워크 사이의 차이를 감추어서(abstract away differences), 데이터가 다른 네트워크들 사이에서 문제없이 전달될 수 있도록 공통된 방법을 제공한다. 프로토콜은 다음 두 가지 기본 기능을 제공한다:
- naming scheme: 프로토콜은 호스트 주소에 대한 표준적인 형식을 정의한다.
- 이를 통해 각각의 호스트와 라우터는 고유하게 식별되는 주소를 하나 이상 부여받는다.
- delivery mechanism: 프로토콜은 표준적인 청크 단위인 패킷을 정의한다.
- 패킷은 메타데이터를 저장하는 헤더 필드와 데이터를 저장하는 페이로드로 구성된다.
Transferring internet Data Via Encapsulation

Figure 6는 호스트들과 라우터들이 인터넷 프로토콜을 사용하여 호환되지 않는 LAN들 간에 데이터를 전송하는 방법을 보여준다. LAN1에 연결된 호스트 A에서 실행 중인 클라이언트가 LAN2에 연결된 호스트 B에서 실행 중인 서버로 데이터 바이트 시퀀스를 전송하는 상황이며, 이 과정은 여덟 가지 기본 단계로 이루어진다:
- 호스트 A의 클라이언트가 가상 주소 공간(virtual address space)에서 커널 버퍼로 데이터를 복사한다.
- 호스트 A의 프로토콜 소프트웨어는 데이터에 인터넷 헤더와 LAN1 프레임 헤더를 추가하여 LAN1 프레임을 생성한다.
- 인터넷 헤더는 인터넷 호스트 B를 대상으로 하고, LAN1 프레임 헤더는 라우터를 대상으로 한다. 그런 다음 프레임을 어댑터로 전달한다.
- 이때, LAN1 프레임의 페이로드가 하나의 인터넷 패킷이며, 이 패킷의 페이로드가 실제 사용자 데이터이다.
- LAN1 어댑터가 프레임을 네트워크로 복사한다.
- 프레임이 라우터에 도달하면, 라우터의 LAN1 어댑터가 이를 읽고 프로토콜 소프트웨어에 전달한다.
- 라우터는 인터넷 패킷 헤더로부터 수신측의 인터넷 주소를 추출하고 이를 라우팅 테이블의 인덱스로 사용하여 패킷을 어디로 전달할지를 결정한다.[9]
- 라우터는 이전 LAN1 프레임 헤더를 제거하고, 호스트 B를 대상으로 하는 새 LAN2 프레임 헤더를 붙여 프레임을 어댑터에 전달한다.
- 라우터의 LAN2 어댑터가 프레임을 네트워크로 복사한다.
- 프레임이 호스트 B에 도달하면, 호스트 B의 어댑터가 이를 선으로부터 읽고 프로토콜 소프트웨어에 전달한다.
- 마지막으로, 호스트 B의 프로토콜 소프트웨어가 패킷 헤더와 프레임 헤더를 제거한다.
- 서버가 데이터를 읽기 위해 시스템 호출을 하면, 프로토콜 소프트웨어는 결과 데이터를 서버의 가상 주소 공간으로 복사한다.
The Global IP Internet

글로벌 IP 인터넷(Global IP Internet)은 인터넷의 가장 대표적인 예시이다. Figure 7은 인터넷 클라이언트-서버 애플리케이션의 기본 하드웨어 및 소프트웨어의 구성을 보여준다. 각 인터넷 호스트는 TCP/IP 프토토콜을 구현한 소프트웨어를 실행한다. 이때 TCP/IP는 각각 IP, TCP, UDP 프로토콜로 구성된다. IP 프로토콜은 naming schema와 다른 호스트로 "최선을 다해" 패킷을 전송하는 메커니즘을 제공한다. 이때 IP 프로토콜의 전송 메커니즘은 unreliable하며, 전송 도중 패킷이 손실되거나 중복되어도 이를 복구하지 않는다. UDP는 transport layer에서 구현되어, 호스트의 "프로세스"간의 데이터그램[10]을 unreliable하게 전송하는 메커니즘을 제공한다. TCP도 transport layer에서 구현되어, 호스트의 "프로세스"간의 데이터그램을 reliable하게 전송할 수 있는 메커니즘을 제공한다. 즉, UDP와 TCP는 "프로세스" 사이의 logical communication을 제공하며, IP 프로토콜은 "호스트" 사이의 패킷 전송 메커니즘을 제공한다. 이들 프로토콜은 소켓(socket) 인터페이스 함수와 Unix I/O를 통해서 서버와 클라이언트 사이의 통신에서 사용된다. 이때 소켓 함수들은 일반적으로 system call로 구현되며, 커널로 trap되어 TCP/IP 내의 다양한 커널 모드 함수들을 호출한다.
프로그래머의 관점에서, 인터넷은 다음의 특성들을 가진 전세계의 호스트들의 모임이다.
- 호스트들은 각각 고유한 32비트 IP 주소를 할당받는다.
- IP 주소는 모두 각각 도메인이라는 고유한 식별자이름에 대응된다.
- 한 인터넷 호스트의 프로세스는 다른 모든 인터넷 호스트의 프로세스와 연결을 통해 통신할 수 있다.
IP Addresses
IP 주소(IP address)는 기본적으로 32비트 정수로 되어 있으며, 이는 IPv4 방식에 해당한다. 또한, 현재는 추가적으로 IPv6 방식이 개발되어 128비트 정수로된 IP주소가 사용된다. 하지만 IPv6는 IPv4의 연장선으로 개발되어 혼용되고 있으며, 여전히 IPv4 방식이 전체 인터넷 트래픽의 절대적인 양을 차지한다. 또한 IP 주소는 아래와 같은 구조체에 정의되어 있다:
/* IP address structure */
struct in_addr {
uint32_t s_addr; /* Address in network byte order (big-endian) */
};
또한 IP 주소들은 메모리 내에 항상 network byte order(big-endian)으로 저장된다. 이는 각각의 인터넷 호스트들이 서로 다른 endian 방식을 가지고 있을 수 있기 때문이다. 이때 유닉스는 네트워크와 호스트의 바이트 순서 간의 변환을 위한 아래의 함수들을 제공한다:
#include <arpa/inet.h>
// Returns: value in network byte order
uint32_t htonl(uint32_t hostlong); //32비트 정수에 대해 사용
uint16_t htons(uint16_t hostshort); //32비트 정수에 대해 사용
// Returns: value in host byte order
uint32_t ntohl(uint32_t netlong); //16비트 정수에 대해 사용
uint16_t ntohs(uint16_t netshort); //16비트 정수에 대해 사용
htonl/htons 함수는 호스트 바이트 순서를 network byte order로 변환한다. 즉, big endian 방식으로 변환한다. ntohl/ntohs 함수는 반대로 network byte order를 호스트 시스템의 endian에 맞게 변환한다.
IP 주소는 사람이 읽기 편하도록 dotted-decimal notation으로 표기되는 데, 이는 IP주소를 1바이트 단위로 10진수 단위로 바꾸어 표기하는 것이다. 예를 들어, 128.2.194.242는 0x8002c2f2를 dotted-decimal notation으로 변환한 값이다. 리눅스 시스템에서는 다음과 같이 hostname 명령어를 사용해 자신의 호스트의 도트-10진 주소를 확인할 수 있다:
linux> hostname -i
128.2.210.175
Internet Domain Names

인터넷의 클라이언트와 서버는 서로 통신할 때 IP 주소를 사용한다. 하지만 큰 정수는 사람이 기억하기 어려우므로, IP 프로토콜은 IP 주소에 대응되는 도메인(domain) 이름을 정의하여 사람이 쉽게 기억할 수 있도록한다. 도메인 이름은 계층 구조를 형성하며, 도메인 이름은 각각의 부분이 계층 내에서 어느 위치에 있는지를 인코딩한다. Figure 8은 이 계층 구조가 어떻게 조직되어있는지 보여준다. 도메인 이름의 계층 구조는 tree 구조로 표현되며, 각 노드는 루트 노드까지 거슬라올라가는 경로를 통해 형성된 도메인 이름을 나타낸다. subtree는 서브도메인(subdomain)이라고 불리며, 이는 unnamed root 노드와, first-level domain, second-level domain, ...등으로 나뉜다. 계층의 첫번째 레벨은 unnamed root이며, 그 다음 레벨은 first-level domain이다. 이는 ICANN이라는 비영리 단체에 의해 정의된 최상위 도메인들로, om, edu, gov, org, net 등으로 구성되어 있다. 그 다음 레벨은 second-level domain으로, 이는 ICANN의 다양한 공인 기관들에 의해 선착순으로 할당되는 도메인 이름들이다. 이때 어떤 조직이 second-level domain을 할당 받으면, 해당 조직은 해당 도메인 내에서 새로운 도메인 이름을 자유롭게 생성할 수 있다.
도메인 이름과 IP 주소 사이의 대응 관계는 DNS라고 불리는 전세계에 분산되어 있는 데이터베이스에 저장되어 있다. 개념적으로 DNS 데이터베이스는 수백만 개의 호스트 항목으로 구성되어 있으며, 각각의 항목은 도메인 이름과 IP 주소 사이의 대응 관계를 정의한다. 리눅스의 nslookup 명령어는 해당 도메인 이름에 연관되어 있는 IP주소들을 보여주며, 이를 통해 DNS 매핑의 몇가지 특성들을 보여줄 수 있다.
각 인터넷 호스트는 로컬에서 정의된 도메인 이름 localhost를 가지며, 이는 항상 루프백 주소(loopback address) 127.0.0.1로 매핑된다:
linux> nslookup localhost
Address: 127.0.0.1
또한, hostname 명령어를 통해서 로컬 호스트의 실제 도메인 이름을 확인할 수 있다.
linux> hostname
whaleshark.ics.cs.cmu.edu
이때, 도메인 이름과 IP 주소 간의 대응 관계는 여러 형태로 나타날 수 있다. 예를 들어 가장 단순한 경우에는 하나의 도메인 이름이 하나의 IP 주소로 매핑된다:
linux> nslookup whaleshark.ics.cs.cmu.edu
Address: 128.2.210.175
그러나 어떤 경우에는 여러 개의 도메인 이름이 하나의 IP 주소로 매핑될 수도 있다:
linux> nslookup cs.mit.edu
Address: 18.62.1.6
linux> nslookup eecs.mit.edu
Address: 18.62.1.6
가장 일반적인 경우에는 여러 도메인 이름이 여러 IP 주소 집합으로 대응될 수도 있다.
linux> nslookup www.twitter.com
Address: 199.16.156.6
Address: 199.16.156.70
Address: 199.16.156.102
Address: 199.16.156.230
linux> nslookup twitter.com
Address: 199.16.156.102
Address: 199.16.156.230
Address: 199.16.156.6
Address: 199.16.156.70
마지막으로, 어떤 유효한 도메인 이름이 IP 주소에 대응되지 않을 수도 있다.
linux> nslookup edu
*** Can’t find edu: No answer
linux> nslookup ics.cs.cmu.edu
*** Can’t find ics.cs.cmu.edu: No answer
Internet Connections

인터넷의 클라이언트와 서버는 바이트 스트림(streams of bytes)을 주고받는 방식으로 통신한다. 이때 TCP 프로토콜 기준으로, 바이트 스트림을 서로 주고 받기 위해서는 서로 간의 연결(connection)이 필요한데, 이때 각 연결은 다음과 같은 특성을 가진다.
- point-to-point: 각 연결은 한쌍의 프로세스에 대해 이루어진다.
- Full-duplex: 데이터가 양방향으로 동시에 흐를 수 있다.
- Reliable: 어떤 물리적으로 중대한 고장 등이 없는 경우, 송신 프로세스가 보낸 바이트 스트림은 수신 프로세스에 모두, 동일한 순서로 도착한다.
소켓은 커널의 관점에서는 각 연결에 대한 endpoint이다. 또한 각 애플리케이션의 관점에서는, 네트워크에 대한 I/O를 가능하게 하는 파일 디스크립터이다.[11] 각 소켓은 소켓 주소를 가지며, 이는 IP 주소와 16비트로 구성된 포트 번호(port)로 이루어져있다. 소켓 주소는 address:port 형식으로 표기된다.
클라이언트의 소켓 주소의 포트 번호는 커널이 연결을 요청할 때 자동으로 할당되며, 이를 ephmeral port라고 한다. 반면 서버의 소켓 주소에 있는 포트 번호는 일반적으로 해당 서비스에 영구적으로 할당된 well-known port이다. 예를 들어, 웹 서버는 보통 포트 80, 이메일 서버는 포트 25를 사용한다.[12] 하나의 연결은 두 endpoint의 소켓 주소, 즉 송신측과 수신측의 IP 주소, 포트 번호에 의해 유일하게 식별된다. 두 소켓 주소의 쌍을 소켓 쌍(socket pair)라고 하며, 아래와 같은 형식으로 표기한다:
(cliaddr:cliport, servaddr:servport)
여기서 cliaddr는 클라이언트의 IP 주소, cliport는 클라이언트 포트, servaddr는 서버의 IP 주소, servport는 서버 포트이다. 예를 들어, figure 9은 웹 클라이언트와 웹 서버 사이의 연결을 보여준다. 해당 figure에서 웹 클라이언트와 웹 서버의 소켓 주소는 각각 아래와 같다:
128.2.194.242:51213 #웹 클라이언트의 소켓 주소
208.216.181.15:80 #웹 서버의 소켓 주소
이러한 클라이언트와 서버의 소켓 주소가 주어졌을 때, 클라이언트와 서버 간의 연결은 다음과 같은 소켓 쌍으로 유일하게 식별된다:
(128.2.194.242:51213, 208.216.181.15:80)
The Sockets Interface
소켓 인터페이스(socket interface)는 Unix I/O 함수들과 함께 사용되어 네트워크 애플리케이션을 구축할 수 있게 하는 함수 집합이다. 해당 인터페이스는 모든 Unix 계열의 운영체제와, Windows, MAC OS 등을 포함한 현대의 시스템 대부분에 구현되어 있다.
Socket Address Structures
리눅스 커넘의 관점에서는 소켓은 연결의 end point이다. 하지만 리눅스 프로그램의 관점에서 보면, 소켓은 대응되는 파일 디스크립터를 가진 열린 파일(open file)이다. 일반적인 file I/O와 socket I/O의 주된 차이점은 어떻게 애플리케이션이 소켓 디스크립터를 여는지에서 기인한다.
connect, bind, accept와 같은 함수들은 주소 인자로 struct sockaddr* 타입을 받는다. 이때 구조체는 여러 프로토콜 용 구조체(sockaddr_in, sockaddr_un 등)를 포괄해야 하므로 제네릭 구조체로 설계된다.

// Generic socket address structure (for connect, bind, and accept)
struct sockaddr {
uint16_t sa_family; // Protocol family
char sa_data[14]; // Address data
};
sa_family는 어떤 종류의 주소인지 구분(AF_INET: IPv4, AF_UNIX: 유닉스 도메인 등)하며, sa_data는 실제 주소(예: IP, 포트 등)가 들어가며 내용은 프로토콜마다 달라진다. 해당 구조체의 메모리 구조는 Figure 10과 같다.
인터넷 전용 주소의 구조체는 sockaddr_in을 사용한다.

// IP socket address structure
struct sockaddr_in {
uint16_t sin_family; // Protocol family (항상 AF_INET으로 설정됨)
uint16_t sin_port; // 네트워크 바이트 순서로 저장된 포트 번호
struct in_addr sin_addr; // 네트워크 바이트 순서로 저장된 IP 주소
unsigned char sin_zero[8]; // Pad to sizeof(struct sockaddr)
};
해당 구조체를 connect, bind, accept와 같은 함수들에서 사용하고자 할 때는 (struct sockaddr *)로 형변환을 해야 한다.
이때 sin_family는 항상 AF_INET으로 설정된다. 또한 sin_port 필드는 16비트 포트 번호를 의미하며, sin_addr 필드는 32비트 IP 주소를 저장한다. 이때 IP 주소와 포트 번호는 항상 네트워크 바이트 순서(big endian)로 저장된다.
각주
- ↑ 서비스를 받기 위함이다.
- ↑ 보통 이더넷 카드(Ethernet card)라고도 불린다.
- ↑ 보통 고속 점대점 전화선(point-to-point phone lines) 을 통해 연결된다.
- ↑ 대문자 "I"의 Internet이다.
- ↑ 소문자 "i"의 일반적인 internet에 해당한다.
- ↑ 보통은 twisted pair가 사용된다.
- ↑ 비단 LAN이 아우르는 범위 만이 아니라 전세계적으로
- ↑ 예) 00:16:ea:e3:54:e6
- ↑ 이 경우, LAN2가 목적지이다.
- ↑ transport layer에서의 데이터 단위이다. 사실상 패킷과 같은 의미이다.
- ↑ 모든 Unix I/O 디바이스는 네트워크를 포함하여, 파일로 모델링되어 있다.
- ↑ 각 well-known port에는 대응되는 well-known service name이 존재한다. 예를 들어, 웹 서비스의 이름은 http, 이메일 서비스의 이름은 smtp이다.