프로토콜 스택 구성 및 동작

Park Jae Hong·2023년 1월 14일
0

프로토콜 스택의 내부 구성

: 역할이 서로 다른 몇 부분으로 나뉘어져 있는데 상하 관계는 작업을 의뢰하는 쪽이 위쪽, 의뢰를 받아 실제 작업하는 쪽이 아래에 있는데 이는 대강의 경향을 나타낼 뿐, 상하 관계는 때에 따라 역전 되는 경우도 있다.


✔ 애플리케이션

윗 부분 : 네트워크 애플리케이션
이는 브라우저, 메일러 (메일을 읽고 쓰는 소프트웨어), 웹 서버, 메일 서버, 등의 프로그램이 여기에 해당한다. 여기부터 아래로 향하는 데이터 송.수신 등의 일을 의뢰하고 브라우저 뿐만 아니라 어떤 애플리케이션도 네트워크에서 데이터를 송.수신하는 동작은 거의 비슷하다.
아랫 부분 : Socket 라이브러리 (리졸버 내장)

✔ OS

: 애플리케이션 아래에는 OS 내부를 나타내며, 여기에는 프로토콜 스택이 있다. 프로토콜 스택의 윗부분에는 TCP, UDP 라는 프로토콜을 사용하여 데이터 송.수신을 담당하는 부분이 있으며, 이 둘이 애플리케이션에서 보낸 의뢰를 받아 송.수신 동작을 실행한다.( TCP - 브라우저나 메일 등의 일반적인 애플리케이션에 사용, UDP - DNS 서버에 대한 조회 등에서 짧은 제어용 데이터를 송.수신할 때 사용. ) 그 아래에는 IP 프로토콜을 사용하여 패킷 송.수신 동작을 제어하는 부분이 있다. 인터넷에서 데이터를 운반할 때는 데이터를 작게 나누어 패킷이라는 형태로 운반하는데, 이 패킷을 통신 상대까지 운반하는 것이 IP의 주 역할이고 IP 안에는 ICMP와 ARP라는 프로토콜을 다루는 분분이 포함되어 있다. ICMP는 패킷을 운반할 때 발생하는 오류를 통지하거나 제어용 메시지를 통지할 때 , ARP는 IP 주소에 대응하는 이더텟의 MAC 주소를 조사할 때 사용. IP의 아래에 있는 LAN 드라이버는 LAN 어댑터의 하드웨어를 제어하고 그 아래 있는 LAN 어댑터가 실제 송.수신 동작, 즉 케이블에 대해 신호를 송.수신하는 동작을 실행.



데이터 송.수신의 요체가 되는 소켓

✔ 프로토콜 스택


: 프로토콜 스택은 내부에 제어 정보를 기록하는 메모리 영역을 가지고 있으며, 여기에 통신을 제거하기 위한 제어 정보를 기록한다. 대표적인 정보는 통신 상대의 IP 주소는 무엇인가, 포트번호는 몇 번인가, 통신 동작이 어떤 진행 상태에 있는가 하는 것입니다. 본래 소켓은 개념적인 것이어서 실체가 없으므로 굳이 말하자면 이 제어 정보가 소켓의 실체이다. 프로토콜 스택은 기록한 제어 정보를 참조 하면서 동작한다. (Ex - 데이터를 송신할 때는 소켓에 기록되어 있는 상대측의 IP 주소나 포트 번호를 보고 그 IP 주소와 포트 번호를 대상으로 데이터를 송신한다. 그런데 도중에 데이터가 없어질 수 있으며, 이 경우 응답이 돌아오지 않는다. 따라서 소켓에는 응답이 돌아오는지의 여부와 송신 동작 후의 경과 시간 등이 기록 되어 있고 프로토콜 스택은 이 정보를 보고 포기하거나 다시 보내는 동작을 실행한다. )


✔ 현실에서 소켓 살펴보기

: 윈도우의 경우 netstat 라는 명령으로 소켓의 내용을 화면에 표시 할 수 있다. 이 표시의 한 행이 하나의 소켓에 해당된다. 소켓을 만든다는 동작은 여기에 새로 한 행의 제어 정보를 추가하고 ‘여기부터 통신을 시작하는 곳’ 이라는 식으로 상태를 기록하거나 송.수신 데이터를 일시적으로 저장하는 버퍼 메모리를 준비하는 등 통신을 준비하는 작업이다.

✔ 표시의 의미

EX)
Proto : TCP
Local Address : 118.42.2.212:2477
Foreign Address : 222.233.53.144.80
State : EXTABLISHED
PID : 1720

: PID(Process ID) 가 1720인 프로그램이 118.42.2.212 라는 IP 주소를 할당한 LAN 어댑터를 사용하여 222.233.53.144 의 IP 주소를 할당한 상대와 통신하고 있다는 것이고, 자신의 2477, 상대는 80이라는 포토 번호를 사용하는 것도 알수 있다


서버 접속

✔ 접속의 의미

: 이더넷이나 통신 회선은 항상 케이블이 연결되어 있으므로 언제나 신호를 보낼 수 있다. 그러므로 데이터를 신호로 변환하여 송신하기만 하면 언제든지 통신이 가능하다. 그러나 이 시점에서, 즉 소켓을 만든 직후에 애플리케이션에서 데이터 송신 의뢰가 아직 거기에 아무 것도 기록되어 있지 않으므로 통신상대가 누구인지 모른다. 이상태에서는 송신 의뢰가 와도 데이터를 어디로 보내면 좋을지 알수 없고 브라우저는 URL을 바탕으로 서버의 IP 주소를 조사하고, 포트 번호는 80번을 사용하도록 규칙이 정해져 있으므로 필요한 정보를 안다고 할 수 있다. 그러나 브라우저가 알고 있는 정보만으로는 부족해서 socket 을 호출하여 소켓을 만드는 동작만으로는 프로토콜 스택에 아무 것도 전달되지 않기 때문에 서버의 IP 주소나 포트 번호를 프로토콜 스택에 알리는 동작이 필요한데 그 중 한가지 역할이 접속 이다.
서버 측도 클라이언트 측과 마찬가지로 소켓을 만드는 동작으로는 통신 상대를 알 수 없다. 또한 서버측은 애플리케이션에서도 상대를 알 수 없으므로 그래로는 언제까지나 상대를 알 수 없는 상태이고 그래서 클라이언트에서 ‘이곳의 IP 주소는 ooo.ooo.ooo.ooo 이고 포트 번호는 yyyy 입니다. 데이터 송.수신을 하고 싶은데 어떠세요 ?’ 라고 정보를 알려서 통신하려는 클라이언트가 있다는 것을 서버측에 전달하다. 그럼 서버 측에 프로토콜 스택도 클라이언트의 정보를 가질 수 있다.

✔ 접속 동작

: 통신 상대와의 사이에 제어 정보를 주고받아 소켓에 필요한 정보를 기록하고 데이터 송.수신이 가능한 상태로 만든다. 그리고 데이터 송.수신 동작을 실행할 때는 ‘버퍼 메모리’ 가 필요한데 이를 확보하는 것도 동작을 할 때 실행되는데, 이것이 ‘접속’한다는 동작이다.


✔ 제어 정보 (2 가지)


  1. 클라이언트와 서버가 서로 연락을 절충하기 위해 주고 박는 제어 정보, 이 제어 정보를 패킷의 맨 앞부분에 배치하는 곳부터 헤더 하고 부른다.
  2. 소켓에 기록하여 프로토콜 스택의 동작을 제어하기 위한 제어 정보

실제 접속 동작

: 가장 먼저 하는 것은 connect 호출이다. 그 후 서버측의 IP 주소와 포트 번호를 쓰면 명령이 프로토콜 스택의 TCP 담당 부분에 전달된다. 그러면 TCP 담당 부분은 IP 주소로 표시된 상대, 즉 서버의 TCP 담당 부분과의 사이에 제어 정보를 주고 받습니다.

  1. 데이터 송.수신 동작의 개시를 나타내는 제어 정보를 기록한 헤더를 만든다. 이 헤더에 가장 중요한 것은 송신처와 수신처의 포트 번호이다. 이를 통해 송신처가 되는 클라이언트측의 소켓과 수신처가 되는 서버측의 소켓을 지정할 수 있고 접속해야하는 소켓이 어느 것인지 확실히 하고 컨트롤 비트인 SYN 이라는 비트를 1로 만든다.


  2. TCP 헤더를 만들면 이것을 IP 담당 부분에 건네주어 송신하도록 의뢰한다.
    그러면 IP 담당 부분이 패킷 송신동작을 실행하고 네트워크를 통해 패킷이 서버에 도착하면 서버측의 IP 담당 부분이 이것을 받아 TCP 담당 부분에 건네준다. 이후 서버측의 TCP 담당 부분이 TCP 헤더를 조사하여 기록되어 있는 수신처 포트 번호에 해당하는 소켓을 찾아낸다. 해당 하는 소켓이 발견되면 여기에 필요한 정보를 기록하고 접속 동작이 진행중이라는 상태가 된다. 이 과정이 끝나면 서버의 TCP 담담 부분은 응답을 돌려 보낸다.


  3. 클라이언트와 마찬가지로 송신처와 수신처의 포트 번호나 SYN 비트 등을 설정한 TCP 헤더를 만든다. 그리고 응답을 돌려 보낼 때 ACK 라는 컨트롤 비트도 1로 만든다. 네트워크에는 오류가 있을 수 있으므로 패킷이 없어지는 경우에는 패킷이 도착한 것을 확인하면서 동작을 진행하는데, 이것을 확인하기 위해 ACK 비트를 1로 만드는 것이다. 그리고 TCP 헤더를 IP 담당 부분에 건네주어 클라이언트에 반송하도록 의뢰한다.


  4. 패킷이 클라이언트에 돌아오고 IP 담당 부분을 경유하여 TCP 담당 부분에 도착한다. 이때 TCP 헤더를 조사하여 서버측의 접속 동작이 성공 했는지 확인하고 SYN이 1 이면 접속 성공이므로 소켓에 서버의 IP 주소나 포트 번호 등과 함께 소켓에 접속 완료를 나타내는 제어 정보를 기록한다. (클라이언트는 끝남)

    ❗ 서버가 응답을 돌려보낼 때, ACK 비트를 1로 만들었는데, 이것과 같이 패킷이 도착한 것을 서버에 알리기 위해 ACK 비트를 1로 만든 TCP 헤더를 반송하면 데이터를 송.수신할 수 있는 상태가 된다. 이 때 파이프와 같은 것으로 소켓이 연결되었다고 생각할 수 있다. 이 파이프와 같은 것을 커넥션 이라고 한다.

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글