2. TCP/IP

Vorhandenheit ·2022년 6월 27일
0

Network

목록 보기
3/6

TCP/IP

이전 장에는 client에서 server가 어떻게 네트워크가 연결되는지 다루는 과정 중에, 프로토콜 스택에 대해서 다뤘습니다. 이번 장은 프로토콜 스택이 어떤식으로 구성되어잇는지, 어떤식으로 연결하는지 구체적으로 다뤄봅니다.

1. 프로토콜 스택

프로토콜 스택을 보면 TCP, UDP, IP가 있음을 볼 수 있습니다.

  • TCP, UDP : 프로토콜을 사용해서 데이터 송, 수신을 담당합니다
  • IP : 패킷 송, 수신 동작을 제어합니다.
  • ICMP : 패킷을 운반할 때, 발생하는 오류를 통지하거나 제어용 메시지를 통지 할때 사용합니다
  • ARP : IP 주소에 대응하는 이더넷의 MAC 주소를 조사할 때 사용합니다.

여기서 패킷이란 데이터를 작게 나눈걸 말합니다.

밑에 LAN 드라이버는 LAN 어댑터 하드웨어를 제어함으로, LAN 어댑터가 케이블에 신호를 송, 수신하는 동작을 실행합니다.

프로토콜 스택에 대략적인 구조입니다. 이제는 프로토콜 스택이 어떠한 일을 하는지 살펴보겠습니다.

(1) 소켓 생성

애플리케이션에서 DNS, 리졸버를 통해 요청이 들어와 socket을 호출했다면 프로토콜 스택은 의뢰를 받아 소켓을 생성합니다.
그러면
1. 프로토콜 스택은 이 소켓 제어 정보를 기록하는 메모리 영역을 먼저 확보합니다.
2. 그리고 소켓을 생성 후, 소켓을 나타내는 디스크립터를 애플리케이션에 알려줍니다.

앞에서 디스크립터가 어떠한 일을 하는지 나와있습니다.(식별!)

(2) 소켓 연결

애플리케이션은 디스크립터를 받으면 소켓에서 connect를 호출합니다. 그러면 프로토콜 스택은 자기쪽에 소켓을 서버쪽의 소켓과 접속합니다.
여기서 접속할 때, TCP의 헤더 정보를 통해 가능합니다.

이러한 형식은 제어정보로 규정되어있습니다.

연결의 과정은 이렇습니다.
1. connect를 호출합니다.
2. TCP 부분에서 접속을 나타내는 제어 정보를 기록한 TCP 헤더를 만듭니다.
3. 그리고 나서 TCP 헤더의 송신처와 수신처의 포트번호로 접속하는 소켓을 지정합니다. 이때 접속해야하는 소켓이 지정된다면, 컨트롤 비트인 SYN 이라는 비트를 1로 만듭니다.
4. TCP 헤더를 만들면 이걸 IP 담당 부분에 건네주고 송신하도록 요청합니다.
5. IP 담당 부분이 다시 패킷 송신 동작을 실행하고
6. 서버에 패킷이 이것을 받고 TCP 담당 부분에 건네줍니다.
7. 서버 역시 마찬가지로 포트번호헤 해당하는 소켓을 찾아냅니다
8. 해당 소켓이 발견되면 접속 동작이 이루어지고 과정이 끝나면 응답을 돌려보냅니다.
9. 이때 응답을 보낼 때 서버와 마찬가지로 SYN 비트등이 포함된 TCP 헤더를 만들고 , ACK 라는 컨트롤 비트로 1로 만듭니다. 이는 패킷을 받은 것을 표시하기위해서입니다.
10. 끝날꺼같지만 패킷이 다시 클라이언트에 돌아오고 TCP 헤더를 조사해서 서버측의 접속 동작이 성공했는지 확인합니다.
11. 다음 서버에서 ACK 비트를 1로 만든 걸, TCP 헤더에 담아 반송합니다. 이게 도착하면 접속 동작의 대화가 끝이납니다.

(3) 데이터 송, 수신

connect가 완료되고 애플리케이션 제어가 돌아오면 데이터 송, 수신 동작에 들어갑니다.
이때 write를 호출합니다. 그리고 송신 데이터를 프로토콜 스택에 건네줍니다.

이때 바로 실행하는 것이 아니라 일단 프로토콜 스택은 송신용 버퍼 메모리 영역에 저장합니다.
이렇게 하는 이유는, 받은 데이터를 곧바로 보내면 작은 패킷을 많이 보낼경우 네트워크 이용 효율이 저하되기 떄문입니다. 모았다가 한꺼번에 보내줍니다.
이 모으는 기준은 MTU 라는 매개변수를 바탕으로 판단합니다.

반대로, MTU가 넘는 데이터가 들어왔을 경우에는 MSS부분 데이터부분을 분할한 뒤에 보내게됩니다. 이럴경우 데이터를 받았을 때 다시 조합하게 되는데, 순서가 뒤섞일수 있습니다. 이를 위해 시퀸스 번호에 기록합니다. 이를 통해 누락되었는지 수신확인이 되었는지 확인할 수 있습니다.


syn, ack를 어디서 본 기억이 있더라니, 3-way handshake와 4-way handshake입니다. 4-way는 후에 나오지만 ,네트워크는 syn과 ack를 통해 데이터를 주고 받음을 서로 확인할 수 있습니다.

(4) close, 소켓 말소

데이터 송, 수신을 종료하는 것은 애플리케이션이 송신해야하는 데이터를 전부 송신 완료했다고 판단했을 때입니다.

  1. 서버에서나 연결을 중단한다고 했을 때, 프로토콜 스택이 TCP 헤더를 작성하고 FIN비트에 1을 설정하고 클라이언트에 송신합니다.
  2. 클라이언트쪽에서는 TCP 헤더가 도착하면 소켓에 서버측이 연결 끊기에 들어갓다는 사실을 기록하고 ACK 번호를 서버측에 반송하고, 다시 송신이 오는 걸 기다립니다.
  3. 서버에서 보낸 데이터가 전부 도착하면 이 사실을 알리고 클라이언트는 종료하고 어플리케이션도 close를 호출합니다. 그리고 서버에 다시 송신하고 ACK 번호가 돌아오면 대화가 접속이 끝이납니다.
  4. 접속이 끝나면 소켓은 바로 말소하지않고 기다립니다. 오작동을 막기위해서입니다.

(5) IP 패킷 송, 수신 동작

패킷은 '헤더'와 '데이터' 두 부분으로 구성됩니다.

  • TCP/IP의 패킷
  1. 패킷 송, 수신의 출발점은 TCP 담당 부분이 IP 담당 부분에 패킷 송신을 의뢰합니다.
  2. IP 담당 부분은 제어 정보를 기록한 헤더를 부가합니다. IP헤더와 MAC 헤더
  3. IP 헤더에는 IP주소로 표시된 제어정보가 MAC 헤더에는 이더넷등의 LAN을 이용하여 가까운 라우터까지 패킷을 운반할 때 사용하는 제어 정보가 기록되어있습니다.
  4. 이를 네트워크용 하드웨어에 건내줍니다.
  5. LAN 드라이버는 IP 담당부분에서 패킷을 받으면 LAN 어뎁터의 버퍼 메모리에 복사합니다. 복사를 마치고 패킷을 송신하도록 MAC 회로에 명령을 보냅니다.
  6. MAC 회로는 프리앰블과 스타트 프레임 딜리미터, 프레임 체크 시퀸스라는 데이터를 부가합니다.
  7. 이것이 LAN 어뎁터로가 전기나 빛의 신호상태로 바꿔서 보내집니다.

MAC주소

  • 송신처 주소 : LAN 어뎁터 제조할 때 ROM에 기록되어있는 값을 말합니다.
  • 이더 타입 : ip헤더의 프로토콜과 비슷합니다.
  • 수신처 주소 : IP주소에서 MAC주소를 조사하는 동작을 실행합니다. 여기서 ARP를 사용해서 MAC주소를 설정합니다.

ARP
Address Resolution Protocol로 이더넷에 연결되어있는 전원에게 패킷을 전달하여, 해당 주소를 가지고 있는 MAC주소를 받아옵니다.


수신
1. LAN 어뎁터를 통해 알맞은 MAC주소로 패킷이 들어왔습니다.
2. LAN 드라이버는 TCP/IP에 프로토콜 스택에 패킷을 건넬 것입니다.
3. IP 담당 부분은 IP주소와 LAN 어뎁터 할당된 주소가 일치하는지 확인합니다.
4. 확인을 해서 맞으면 TCP 담당 부분에 건네줍니다.
5. TCP 담당 부분은 IP헤더에 기록된 수신처 IP주소와 송신처 IP주소, 포트 번호, 송신처 포트번호를 조사해서 해당하는 소켓을 찾습니다.
6. 소켓을 찾으면 상황에 따라 동작을 실행합니다.

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글