TCP 송수신 과정(1)
15 Dec 2019 | NetworkTCP/IP의 통신 과정 (1)
대략적인 네트워크 계층구조
- 애플리케이션 레이어
- 애플리케이션 레이어에는 웹 브라우저, 메일러, 웹 서버, 메일 서버 등이 존재한다.
- Socket 라이브러리가 존재하여 DNS 서버를 조회하거나 소켓을 만드는 일 등을 한다.
- OS 레이어
- 프로토콜 스택이 존재하며, 프로토콜 스택은 TCP, UDP, IP 프로토콜을 포함한다.
- TCP 프로토콜
- 브라우저나 메일 등의 일반적인 애플리케이션이 데이터를 송∙수신할 경우에 사용한다
- UDP 프로토콜
- DNS 서버에 대한 조회 등에서 짧은 제어용 데이터를 송∙수신 하는 경우에 사용한다.
- IP 프로토콜
- 패킷[1]의 송∙수신 동작을 제어한다.
- ICMP 프로토콜과 ARP 프로토콜이 존재한다.
- ICMP 프로토콜 : 패킷을 운반할 때 발생하는 오류를 통지하거나 제어용 메시지를 통지할 때 사용한다.
- ARP 프로토콜 : IP 주소에 대응하는 이더넷의 MAC 주소를 조사할 때 사용한다.
소켓이란
- 프로토콜 스택 내부에 제어 정보를 기록하는 메모리 영역을 가지고 있다. 이것을 소켓이라 부른다.
- 통신 상대의 IP 주소, 포트번호, 통신의 진행상황 등이 기록되어 있다.
-
프로토콜 스택은 이 소켓에 저장된 정보를 참조하면서 동작한다.
- command line에서 netstat 명령어로 소켓 상태를 확인할 수 있다.
TCP/IP 통신 과정
-
요청하기 전에 DNS서버의 IP주소를 알아야 하므로 사진의 ‘gethostbyname’을 호출하여 DNS 서버정보를 먼저 알아낸다. (UDP 프로토콜을 이용한다)
-
① 준비
- 소켓을 만드는 단계, 메모리영역을 확보한다.
- 소켓을 나타내는 디스크립터를 반환한다.
-
② 접속
-
소켓을 만든 직후에는 아무 것도 기록되어 있지 않으므로 통신 상대가 누구인지 모른다.
-
서버의 IP주소나 포트번호를 프로토콜 스택에 알리는 동작이 필요하다.
-
접속 동작의 첫 번째 동작은 통신 상대와 제어 정보[2]를 주고받아 소켓에 필요한 정보를 기록하고 데이터 송∙수신이 가능한 상태로 만드는 것이다. 패킷에 제어정보를 추가하면 그 제어정보가 헤더가 된다.
-
두 번째 동작은 데이터 송∙수신 동작을 실행할때 데이터를 일시적으로 저장하는 ‘버퍼 메모리’ 영역을 확보하는 것이다.
-
대화를 주고받는 과정을 간단히 살펴보면
- 클라이언트에서 컨트롤 비트인 SYN 이라는 비트를 1로 만들어 송신하고
- 패킷을 받은 서버는 ACK 라는 컨트롤 비트를 1로 만들어 응답한다.[3]
- 응답을 받은 클라이언트는 TCP 헤더를 조사하여 SYN=1이면 접속 성공이므로 소켓에 서버 IP주소, 포트 번호 등과 함께 소켓에 접속 완료를 나타내는 제어 정보를 기록한다.
- 패킷이 도착한 것을 알리기 위해 ACK 비트를 1로 만든 TCP 헤더를 서버에 반송한다.
- 이 것이 서버에 도착하면 접속 동작의 대화가 끝난다.
- 클라이언트에서 컨트롤 비트인 SYN 이라는 비트를 1로 만들어 송신하고
-
[1] 패킷
-
네트워크에서 데이터는 수십 바이트에서 수천 바이트 정도의 작은 덩어리로 분할되어 운반된다.
이렇게 분할된 데이터의 덩어리를 ‘패킷’이라고 부른다.
[2] 제어 정보
-
데이터 송∙수신 동작을 제어하기 위한 정보로, IP 주소나 포트번호가 대표적인 예이다.
-
클라이언트와 서버가 서로 연락을 절충하기 위해 주고 받는 제어정보(헤더)[사진1]와
소켓에 기록하여 프로토콜 스택의 동작을 제어하기 위한 정보가 있다.
[사진1]
[3] SYN
- 연결의 시작을 요청하는 플래그
- TCP 3-way handshake
- [Client -> Server] SYN [000010]
- [Server -> Client] SYN/ACK [010010]
- [Client -> Server] ACK [010000]