본문 바로가기

임베디드 리눅스

네트워크 프로그래밍-TCP/IP 패킷 전송

728x90
반응형

 

 

안녕하세요. WH입니다.

알아야 할게 너무나도 많죠?

사실 아키텍처나, 운영체제 관련해서도 다루고 싶긴한데..

솔직히 뭐부터 다뤄야할지 감이 안오네요.

뭐 다루다보면 언젠가는 다 다루지 않겠어요?

뭐 이렇게 이것저것 다루냐고요?

bsp가 원래 그래요. 저 아래서부터 다루다보니..여튼 잡소리 그만하고 시작할게요

 

전반적인 지식은 이전 두개의 글에서 다뤘습니다. 기억이 나지 않는다구요?

아래 두개의 글을 참조해주세요

2022.01.28 - [임베디드 리눅스] - 네트워크 프로그래밍 - 인터넷 프로토콜 스택 4계층

 

네트워크 프로그래밍 - 인터넷 프로토콜 스택 4계층

안녕하세요. WH입니다. 요즘 이것저것 생각나는데로 기초부터 적다보니 중구난방인 부분이 없지않아 있지만, 사실 임베디드 리눅스를 다루려면 알아야하는게 굉장히 많다는 점에서 천천히 알아

developer-wh.tistory.com

2022.01.28 - [임베디드 리눅스] - 네트워크 프로그래밍 - OSI 7계층

 

네트워크 프로그래밍 - OSI 7계층

안녕하세요. WH입니다. 이번 글 역시 네트워크 프로그래밍을 하기 위한 기반 지식입니다. 음 무조건 필요하냐? 아니요. 그런데 알고 있으면 좋아요ㅋㅋㅋㅋ 여튼 시작하겠습니다. 이번 글은 OSI (

developer-wh.tistory.com

 

 

 

간단히 review를 하고 넘어가자면, 네트워크 통신을 하기 위한 과정을 분류하는 모델로 OSI 7계층 표준이 있으며, HTTP 통신을 하기 위해 주소 사용하는 TCP/IP 프로토콜을 OSI 7계층에 맞춰 추상화 한 그림이 TCP/IP 모델인데요.

 

1. Application Layer

  HTTP, FTP, SMTP 등 응용프로그램들이 네트워크를 사용하기 위한 인터페이스를 제공

 

2. Transport Layer

  통신 노드 간의 연결을 제어하고, 유실된 패킷을 재전송하는 등 신뢰성 있는 통신을 보장

 

3. Internet Layer

  패킷을 발신지로부터 목적지로 전달하는 역할

 

4. Network Interface Layer

  물리적인 주소로 MAC을 사용하여 프레임 데이터를 전달

 

보다 자세한 내용은 위의 두 글을 참조해주세요. 이것으로 review는 마치고 본론으로 들어가면

Application layer와 Transport layer 사이에는 소켓이라는 것이 존재합니다. 소켓에 대해 먼저 알아보겠습니다.

소켓

네트워크 ( 전송 계층 ) 에서 프로세스 ( 어플리케이션 ) 로 혹은 프로세스에서 네트워크로 데이터를 전달하는 출입구

 

이 말을 조금 자세히 들여다보면 호스트 ( 수신 측 )의 transport layer 는 데이터를 직접 전달하지 않는다는 말이에요. 호스트( 수신 측 )에 하나 이상의 소켓이 있을 수 있기 때문에, 소켓은 유일한 식별자를 가지며 이 식별자는 TCP 소켓 혹은 UDT 소켓에 따라 달라지죠. 

 

패킷

패킷이란 Internet Layer 에서 데이터 단위를 가리킵니다. 조금더 자세히 알아볼까요?

저번 글에서 다뤘던 7 가지 내용을 이미지화 한 그림입니다. 조금 더 자세히 들여다 보겠습니다.

데이터가 어떻게 전달되고 어떻게 받아들여지는지 송신과 수신으로 나누어 알아보도록 하겠습니다.

송신

 

  데이터를 전송하기 위해서는 데이터의 상위 계층부터 하위 계층까지 거쳐가며 각 계층의 프로토콜 정보와 관련된 헤더를 씌웁니다.

 

1. Application Layer

  app header 에는 실제 데이터를 어플리케이션 계층에 넘기며, 데이터를 인코딩하고 수신자와의 통신할 준비 위한 내용이 포함됩니다. 즉, 해당 헤더에는 어플리케이션 계층의 port 정보, 표현 계층의 데이터 준비 과정, 세션 계층의 통신 준비 과정이 포함되겠지요.

 

2. Transport Layer

  그 다음 TCP 헤더가 붙는 데요. 데이터 크기가 크면 MTU ( Maximum transmission unit, 해당 레이어가 전송할 수 있는 최대 프로토콜 데이터 단위의 바이트를 의미함 ) 단위로 쪼개는 데, 이를 세그먼트라 합니다. 세그먼트를 송신할 때마다 쪼개진 데이터의 순서를 알 수 있도록 Sequence 번호가 기록되는 데 이유는 네트워킹 상황에 따라 데이터의 순서가 바뀔 수 있고 이를 방지하기 위함입니다. 물론 누락 여부 역시 판단할 수 있게 되겠지요.

 

3. Internet Layer

  세그먼트에 IP 헤더를 붙인답니다. 왜냐구요? 목적지를 알아야하잖아요

 

4. Network Interface Layer

  패킷에 Ethernet 헤더와 Tail( FCS : Frame Check Sequence )가 덧붙는데요. 헤더 정보에는 송신자와 수신자의 MAC ( Media Acess Control ) 주소가 담겨있고, 데이터 전송 중 에러를 판별하는 FCS가 포함되어 있으며, 해당 계층에서 데이터 단위를 프레임이라고 합니다.

 

수신

  송신자 측으로부터 받은 프레임은, 하위 계층에서 상위 계층으로 올라가며 헤더를 없애가며 데이터를 받습니다.

 

1. Network Interface layer

  Ethernet 헤더에는 MAC 주소가 담겨있다고 했지요? 도착지 MAC 주소가 자신의 주소와 일치하는지 비교하고, 일치하면 상위 계층으로 보내게 됩니다.

 

2. Internet Layer

  IP 헤더를 검사하는데 목적지 IP 주소 값이 자신의 IP 주소와 일치하는지 비교하고, 일치하면 상위 계층으로 보내게 됩니다.

 

3. Transport Layer

  TCP 헤더의 Sequence 번호를 검사하여 데이터들이 누락되지 않았는지 확인하고, 데이터들이 모두 수신되면 조립합니다.

 

 4. Application Layer

  데이터를 디코딩하여 사용자에게 넘깁니다.

 

 

이렇게 송/수신 과정에 대해서 알아보았는데요. 다음으로는 3 Way Handshake에 대해서 알아보도록 하겠습니다.

 

3 Way Handshake

TCP 연결은 3 way Handshake를 통해 서로 3번의 통신이 이루어 지는데요. 같이 알아보도록할게요

 

1. 클라이언트가 SYN(a) 패킷을 보내고, 응답을 기다리는 SYN_SENT 상태로 전환

2. 서버가 요청을 수락하면 SYN(b)와 ACK( a + 1 )이 담긴 패킷을 보내고, SYN_RECEIVED 상태로 전환

3. 클라이언트는 서버로부터 SYN(b) 와 ACK( a + 1) 패킷을 받고, ACK( b + 1 )를 서버로 보내며 연결이 성립되며 두 호스트는 ESTABLISHED 상태로 전환

 

이후 서로 필요한 데이터를 주고 받게 됩니다. 그 다음로 알아볼 내용은 4 way Handshake 에 대해 알아보도록 하죠.

 

4 Way Handshake

TCP 연결 해제는 4 Way Hnadshake를 통해 연결이 해제되는데요. 내용은 아래와 같습니다.

 

1. 클라이언트는 연결을 종료하겠다는 FIN 플래그를 보냄

2. 서버는 응답 메세지로 ACK를 보내고 자신의 데이터를 모두 보낼 때까지 CLOSE_WAIT 상태로 전환

3. 서버가 데이터를 모두 보내고 통신이 끝났다면 연결이 종료되었다는 FIN 플래그를 클라이언트에게 보냄

4. 클라이언트는 FIN 메시지를 확인했다는 ACK를 보내고 연결을 종료

728x90
반응형