FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

데이터 송수신 과정(프로토콜 스택에 의뢰)

데이터 송수신 과정(프로토콜 스택에 의뢰)

💬 데이터 송 수신 동작의 개요

IP주소를 조사했으면 액세스대상(웹서버에) 메세지를 송신하도록 OS의 내부에 있는 프로토콜 스택에 의뢰 한다(Socket 라이브러리이용) 웹서버에 보내는 HTTP 메세지는 디지털 데이터이므로 디지털 데이터를 송신하도록 의뢰

이 동작은 모든 네트워크 애플리케이션에 해당(DNS서버 를 통해 IP주소 탐색하는것도)

TCP(Transmission Control Protocol)프로토콜을 이용한 데이터의 송수신

클라이언트와 서버간에 데이터는 양방향으로도 이동가능

  • 서버측 소켓(출입문)생성<대기> ->
  • 클라이언트측 소켓생성 ->
  • 클라이언트측 파이프(통로) 서버소켓연결
  • 소켓 생성(소켓작성)
  • 서버측소켓에 파이프연결(접속)
  • 데이터 송수신
  • 파이프 분리 소켓말소(연결 끊기)

단계에 따라 Socket라이브러리 내 프로그램 호출

이 동작을 하는게 OS내부의 프로토콜 스택이다.

Socket라이브러리의 프로그램은 내용을 프로토콜 스택에 전달하는 중개를 할 뿐이지만 라이브러리에 대해 설명하는것은 어려우므로 프로토콜 스택과 라이브러리를 합쳐 설명

👉소켓의 생성

Socket 라이브러리의 부품을 쓸때는 리졸버와 비슷

<디스크립터> = socket(<IPv4 사용>, <스트림형>, ...);

클라이언트의 소켓은 Socket 라이브러리의 socket이라는 프로그램만 호출하면 된다 (socket을 호출 후 제어가 넘어가서 소켓을 만드는 동작을 실행하고 애플리케이션으로 제어가 돌아오는 것)

소켓이 생기면 디스크립터라는 것을 어플리케이션이 메모리에 기록해 두는데 디스크립터는 한대의 컴퓨터에 복수의 소켓(여러개의 송수신 동작)이 존재할때 프로토콜 스택이 식별할 수 있게 해준다.

👉접속단계

만든 소켓을 서버측의 소켓이랑 접속하도록 프로토콜스택에 의뢰하는데 Socket 라이브러리의 connect라는 프로그램을 호출하여 실행

이때 디스크립터,서버의 IP주소, 포트번호를 지정

connect(<디스크립터>, <서버의 IP주소와 포트번호> , ...)

  • 디스크립터 : 어느 소켓을 서버측과 접속할지 판단 (connect 가 프로토콜스택에 통지)
  • IP주소 : 대상 서버의 IP주소 IP 주소는 네트워크에 존재하는 컴퓨터를 식별하기 위해 서로다른 값을 할당한것 (정확히는 기기에 장착된 네트워크용 하드웨어에 할당)
  • 포트번호: 접속하는 컴퓨터의 어느 소켓에 접속할지를 찾아준다

    • 디스크립터와의 차이는 디스크립터는 보내는 측의 소켓을 파악하기위한 것인 반면 서버측의 소켓에 대한 정보를 알 수 없으므로 포트번호를 이용하여 상대측의 소켓을 식별한다

하지만 그렇다고 디스크립터가 필요없는것도 아니다

(포트번호 규칙은 전세계적으로 통일, IP주소와 같이 중복되지 않게 IANA(Internet Assigned Number Authority)라는 기관이 관리하고 있다.)

❔포트번호는 URL 에서 쓸수있지만 일반적으로는 쓰지않고 DNS 서버에서 조회할수도 있지만 이 또한 널리 쓰이지 않는데 일반적으로 애플리케이션의 종류에 따라 미리 결정된 값을 사용한다
즉 브라우저에서 웹서버로 액세스 할땐 80번으로 포트번호가 결정되어있는것

❔❔ 서버측에서 클라이언트측의 소켓번호를 아는 방법은 클라이언트측에서
소켓을 만들때 프로토콜 스택이 할당해준 포트번호를 접속동작(connect)이 실행될때 서버측에 통지 연결되면 프로토콜 스택은 상대의 정보를 소켓에 기록

👉송신 & 수신

  • 송신용데이터: HTTP request massage

애플리케이션은 Socket 라이브러리의 write를 호출, 디스크립터와 송신용 데이터를 전달

write(<디스크립터>,<송신 데이터>, <송신데이터길이>)

디스크립터로 소켓을 판별해 연결하면 상대정보가 저장된 상태이므로 프로토콜 스택이 데이터 송신 그럼 서버는 수신 동작을 실행해 적절한 조작처리후 response massage 반송

<수신데이터길이> = read(<디스크립터>,<수신버퍼>, ...)

애플리케이션내의 메모리영역인 수신버퍼에 저장해준다하고 건네준다

👉연결 끊기

close (<디스크립터>)

  • 파이프가 분리되고 소켓도 말소

웹의 경우 HTTP프로토콜에서 웹서버에서 response massage를 보냈을때 웹서버에서 close를 호출해서 끊는다(애플리케이션마다 다르다)

그럼 후에 read로 수신을 의뢰했을때 연결이 끊겼다는 사실을 통지함으로 연결끊김을 알려주고 브라우저도 연결끊기에 돌입

HTTP프로토콜은 본래 1개의 데이터를 읽을때마다 접속과 끊기를 반복하는데 복수의 리퀘스트와 응답을 하는 방법도 있다. 이 경우 리퀘스트할 데이터가 없어지면 브라우저에서 연결 끊기 동작을 할 수 있다.