소켓을 작성
1%의 네트워크 원리 (07) - TCP/IP의 데이터를 전기 신호로 만들어 보냄 1
- 소켓을 작성
- 서버에 접속
- 데이터 송·수신
- 서버에서 연결을 끊어 소켓을 말소
- IP와 이더넷의 패킷 송·수신 동작
- UDP 프로토콜을 이용한 송·수신 동작
01 소켓을 작성
1 프로토콜 스택의 내부 구성
- 애플리케이션
- 네트워크 애플리케이션 (웹 브라우저, 웹 서버, 메일 서버 등 프로그램)
- Socket 라이브러리
- 리졸버
- Socket 라이브러리
- 네트워크 애플리케이션 (웹 브라우저, 웹 서버, 메일 서버 등 프로그램)
- OS
- 프로토콜 스택
- TCP(커넥션 사용), UDP(커넥션 사용 x)
- IP: 패킷 운반, 경로 결정
- ICMP
- ARP
- 프로토콜 스택
- 드라이버 소프트웨어
- LAN 드라이버: LAN 어댑터 제어
- 하드웨어
- LAN 어댑터: 케이블에 대해 실제 신호를 송·수신 동작
TCP(Transmission Control Protocol)
- 브라우저나 메일 등의 일반적인 애플리케이션이 사용해 데이터를 송·수신
UDP(Uer Datagram Protocol)
- DNS 서버에 대한 조회 등에서 짧은 제어용 데이터를 송·수신
IP(Internet Protocol)
- IP 프로토콜을 사용해 패킷을 송·수신
ICMP(Internet Control Message Protocol)
- 패킷을 운반할 때 발생하는 오류를 통지하거나 제어용 메시지를 통지할 때 사용
ARP(Address Resolution Protocol)
- IP 주소에 대응하는 이더넷의 MAC 주소를 조사할 때 사용
패킷
- 네트워크에서 데이터는 수십~수천 바이트 정도의 작은 덩어리로 분할되어 운반됨
- 이렇게 분할된 데이터의 덩어리
MAC 주소
- IEEE에서 표준화된 LAN 방식의 기기는 모두 같은 형식의 주소 사용
- 이 주소를 MAC 주소라 함
2 소켓의 실체는 통신 제어용 제어 정보
프로토콜 스택
- 내부에 제어 정보를 기록하는 메모리 영역을 가짐
- 여기에 통신 동작을 제어하기 위한 제어 정보를 기록
- 이 제어 정보가 소켓의 실체. 혹은 제어 정보를 기록한 메모리 영역이 소켓의 실체
- 프로토콜 스택은 소켓에 기록된 제어 정보를 참조해 동작
- 윈도우에서
netstat
명령어로 소켓 확인 가능
1
2
3
4
5
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1200
TCP 118.42.2.212:2477 222.233.53.144:80 ESTABLISHED 1720
UDP 0.0.0.0:445 *:* 4
- PID: 해당 소켓을 사용하고 있는 프로그램의 PID
- State: 통신 상태
- LISTENING: 상대의 접속을 기다리는 상태
- ESTABLISHED: 접속 동작이 끝나고 데이터가 통신중인지 나타냄
- Foreign Address: 통신 상대측(원격측)의 IP 주소, 포트 번호
0.0.0.0:0
: 아직 통신 시작하지 않음. 특정 IP 주소나 포트와 연결되지 않았음*:*
: UDP는 소켓을 상대측의 주소나 포트와 연결하지 않음. 상대측은*:*
가 됨
- Local Address: netstat 명령을 실행한 기계 자체(로컬측)의 IP 주소, 포트 번호
- 여러 개의 LAN 어댑터가 장착되었다면 여러 개의 IP 주소 존재
- Proto: 프로토콜의 종류. TCP, UDP
- 한 행이 하나의 소켓을 나타냄
- 소켓 생성은 새로운 한 행의 제어 정보를 추가하는 것
PID(Proccess ID)
- 각 프로그램을 식별하기 위해 OS가 할당하는 번호
3 Socket을 호출했을 때의 동작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
프로토콜 스택 애플리케이션(브라우저)
IP 담당 UDP 담당
DNS <-------------- 송신 <------- <메모리 영역> = gethostbyname(...);
서버 --------------> 수신 ------->
TCP 담당
웹 소켓 작성 <----- <디스크립터> = socket(...);
서버 ----->
<-------------- 접속 <-------- connect(...);
--------------> -------->
<-------------- 송신 <-------- write(...);
-------->
--------------> 수신 <-------- <수신 데이터 길이> = read(...);
-------->
<------------ 연결 끊기 <----- close(<디스크립터>);
------------>
소켓 말소 ----->
소켓 작성
- 소켓 한 개 분량의 메모리 확보
- 초기 상태 기록
디스크립터
- 프로토콜 스택 내부의 다수의 소켓 중 어느 것을 가리키는지 나타내는 정보
참고
성공과 실패를 결정하는 1%의 네트워크 원리