ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로토콜 스택을 이용한 데이터의 송수신 (2)
    네트워크 2018. 5. 24. 23:56

    안녕하세요 오늘은 지난번에 배웠던 네트워크 프로토콜 스택의 간단한 구조를 정의한 공부를 진행했는데

    http://dayzen1258.tistory.com/entry/%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%8A%A4%ED%83%9D%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%B5%EB%B6%80-1?category=820726


    이번 시간 부터는 본격적으로 클라이언트와 서버에서의 데이터의 송수신에 대하여 포스팅을 진행해볼까 합니다.


    먼저 지난번 얘기했던 어플리케이션 계층의 Socket부분이 생각 나시나요?

    사용자의 어플리케이션에서 Socket을 이용해서 리졸버를 통해 도메인에서 IP를 얻어와 보낼 수신지를 정하는 부분은 기억하시나요?


    이러한 소켓의 내용에는 통신 상대의 IP주소, 포트 번호, 통신 동작이 어떤 진행 상태에 존재하는가 등의 내용이 포함되어있습니다.


    프로토콜 스택은 이 정보를 참조해서 동작하는 것이죠.


    이렇게 Socket을 생성하면서 소켓 하나 분량의 메모리 영역을 프로토콜 스택에서 생성을하는데 그 이유는 소켓의 제어 정보를 기억하는 메모리영역은 

    미리 존재하는 것이 아니기에 미리 확보를 한뒤 소켓이 생성된뒤 그 내용을 메모리영역에 넣어야 하기에 생성을 해주는 것입니다.

    이렇게 Socket을 생성한뒤 소켓의 디스크립터를 어플리케이션에 알려줍니다.


    * 디스크립터 : 어플리케이션이 소켓을 식별하는 것


    이렇게 소켓을 생성한 뒤 어플리케이션은 connect를 호출하는데 그 뒤 프로토콜 스택은 자기쪽의 소켓을 서버쪽 소켓에 접속합니다.

    소켓을 생성한 직후에 소켓에는 아무런 정보도 존재하지 않습니다. 그렇기에 통신을 하기위해서는서버의 IP주소나 포트번호를 프로토콜 스택에 전달하는 동작을 수행합니다


    데이터 송수신을 진행할때는 데이터를 일시적으로 저장하는 메모리 영역이 필요한데 이를 버퍼 메모리라고 부릅니다.


    이렇게 데이터의 맨 앞에는 헤더라는 정보가 들어갑니다.

    TCP 헤더에 대한 이미지 검색결과

    출처 : http://www.ktword.co.kr/abbr_view.php?m_temp1=1889


    맨위의 데이터를 봐도 IP헤더 (수신지의 데이터 정보)와 TCP헤더, 그리고 데이터로 이루어져있는 데이터가 전송이됩니다.


    그러나 TCP의 최대 특징은 서버와 클라이언트의 연결이 확인되고 데이터의 교환이 이루어진다는 큰 특징이 존재하는데 이는 어떤 방식으로 동작하냐면

    출처 : http://needjarvis.tistory.com/157


    TCP에서 클라이언트와 서버의 연결을 확인하는 것을 3-Way-Hand Shake라고합니다

    순서를 설명 드리면


    1. 클라이언트에서 요청을 위한 송신지와 수신지의 포트 번호를 알아내어 서버와 클라이언트의 소켓을 지정하고 컨트롤 비트인 SYN이라는 비트를 1로 설정합니다.


    2. 이렇게 만들어낸 TCP헤더를 IP 담당에 건네주어 송신을 진행합니다.


    3. 서버측의 TCP 담당 부분이 헤더를 조사하여 수신처에 저장되어있는 포트번호를 찾아내어 동작이 진행중으로 변경이되고 서버 또한 클라이언트와 마찬가지로 TCP헤더를 만들고 SYN데이터를 헤더에 다시담고 ACK라는 컨트롤 비트를 만들어 1로 설정한뒤 클라이언트에 응답을 보냅니다.


    4. 클라이언트에서는 패킷 정보를 전달받고 TCP헤더를 검사하여 접속 동작이 진행되었는지 확인한 뒤 SYN의 데이터가 1이면 접속 성공이기에 서버의 IP주소, 포트번호를 소켓에 연결되었다고 알리기위해 저장을 합니다.


    5. 서버에서 응답을 준 ACK비트를 패킷이 잘도착했다고 알리기위해서 클라이언트에서는 또 다시 ACK비트를 1로 만든 TCP헤더를 반송합니다.


    이렇게 순서로 소켓의 커넥션이 연결됩니다. 이 연결은 Socket에서 Close를 호출하기 전까지는 계속 존재합니다.


    소켓의 연결이 진행된다면 그 다음부터는 본격적인 데이터 송수신이 이루어지는데 그 과정은 다음 포스팅에서 진행 하도록 하겠습니다~~


    * SYN와 ACK의 비트가 1인 이유는 클라이언트와 서버에서 0과 1로 이루어져 있는 비트중에서 성공적으로 수신이 되었는지 알기위해서 1로 설정한 것이라고 생각합니다.



    긴글 읽어 주셔서 감사하고 언제나 틀린 부분이나 보충할 내용은 환영입니다.

    감사합니다 :)

    '네트워크' 카테고리의 다른 글

    프로토콜 스택을 통한 네트워크 공부 (1)  (0) 2018.05.17

    댓글

Designed by Tistory.