멀티플레이어 게임 프로그래밍 - 2장 연습문제

jh Seo·2023년 1월 12일
0
  1. tcp/ip 스택계층의 주요 5계층은
    물리 계층, 링크 계층, 네트워크 계층, 전송 계층, 응용 계층으로 되어 있다.

    • 물리 계층 - 전기신호가 흘러들어가는 계층으로, 가장 기본적인 하드웨어 전송을 지원하는 계층이다.
    • 링크 계층 - 물리적으로 연결한 호스트 사이에서 통신하는 계층이다.
    • 네트워크 계층 - 링크계층 위에 논리 주소 체계를 구축하여
      링크 계층 네트워크이나 물리적 매체가 달라도 통신이 가능하고,
      하드웨어가 바뀌어도 주소 걱정할 필요가 없어진다.
    • 전송 계층 - 포트를 통해 원격 호스트상의 개별 프로세스들 사이의
      통신을 가능케 한다.
      다양한 전송계층 프로토콜이 존재하지만 게임 개발에선 UDP/TCP를 사용한다.
      UDP는 가벼운 대신 연결이 유지되지 않고 전송을 보장하지 않는다.
      TCP는 패킷이 크지만 연결이 유지되며 전송과 순서를 보장한다.
    • 응용 계층 - TCP/IP스택의 최상단에 자리잡은 계층으로,
      코드를 작성하면 응용 계층에 프로그래밍된다.
      DHCP/DNS등의 프로토콜이 있다. 둘이 연결매체가 서로 밀접하게 연관되어 있다보니
      링크계층과 물리계층을 별도의 계층으로 취급하지 않는 모형들도 있다.
  2. ARP란 주소 결정 프로토콜(adress resolution protocol)로
    IP주소를 이에 대응하는 MAC주소로 변환해준다.
    ARP 는 두 부분으로 구성되어 있으며 NIC가 어떤 MAC주소에 대응되는지
    질의하는 패킷구조이고, 하나는 짝을이루는 NIC주소와 MAC주소쌍을 정리해둔 표다.

  3. 라우터란 서로다른 서브넷을 연결하는 호스트로, 하나의 라우터에 여러 개의 NIC가 여러 개 장착되며, 각 NIC마다 고유 ip주소가 할당되어 있다.
    이를 서브넷 마스크를 통해 비트 AND연산으로 같은 값이 나오는 ip주소로
    네트워크인지를 구별한다.
    각 호스트의 ip 모듈은 라우팅 테이블을 보유하여 서브넷당 패킷 전달에 이용한다.
    원격 호스트에 ip패킷을 보내도록 어떤 호스트의 ipv4모듈에 요청하면
    라우팅 테이블을 참조하는데, 라우팅 테이블엔 도달 가능한 목적지 서브넷마다 패킷을 어떻게 전달할지에 대한 정보가 한 줄씩 기록되어있다.

  4. MTU란 최대 전송 유닛(Maximum Transmission Unit)의 약자로
    이더넷 패킷 한 번 전송에 최대한 담을 수 있는 데이터의 양을 뜻한다.
    이더넷 표준은 페이로드의 최대 길이를 1500바이트로 정의하고 있다.

  5. 보내야 하는 원래 패킷 헤더의 분열 식별자, 분열 플래그, 분열 오프셋 값은 0으로 정해져 있다.
    두 개의 패킷으로 나웠을 때,
    두 개의 패킷의 페이로드 값은 헤더 길이때문에 최대 380이다.
    두 개의 패킷의 분열 식별자는 같은 숫자로 설정되어 있다.
    분열 플래그는 마지막 조각외의 모든 조각에 0x04로 설정되어 있고,
    나머지 조각에 0으로 설정되어 있다.
    따라서 둘로 나뉜 조각 중 첫번째 조각에 0x04,
    두번째 조각에 0으로 설정되어 있다.
    분열 오프셋은 필드는 8바이트 블록 단위로 해야하므로,
    첫 번째 패킷 오프셋은 380/8=47.5
    두 번째 패킷 오프셋은 95로 설정된다.

  6. ip패킷 계층에서 분열이 일어나지 않도록 피해야하는 이유는

    1. 헤더 길이 때문에 실제 네트워크를 통해 보내는 데이터양이 늘어난다.

    2. 조각이 하나라도 없어진다면 다른 조각을 전부 버려야하므로,
      조각 수가 많을수록 손해가 크다.

  7. 각 패킷마다 헤더의 길이인 20바이트가 필요하므로 자주 보낼수록
    비효율적이다. 따라서 한번 보낼때 최대한 크게 보내야한다.

  8. 비신뢰성 데이터 전송은 데이터의 순서나 전달을 보장해주지 않는 전송이고, 신뢰성 데이터 전송은 이런 부분들을 다 보장해준다.

  9. 호스트 A와 B사이에서 핸드셰이킹이 일어난다고 해보자.

    • A에서 B로 첫번째 세그먼트를 보내서 연결을 시도한다.
      SYN플래그가 설정되어 있고, 초기 시퀀스번호를 임의로 1000으로 설정한다.

    • B가 연결을 받을 수 있는 상황이면,
      SYN,ACK플래그를 켜진 패킷으로 응답한다.
      이때 응답패킷의 ACK번호는 호스트 A가 보내준 번호 +1로 보낸다.
      그 후, B가 A로 보내는 시퀀스 번호는 임의로 B가 고르는데
      임의로 3000으로 한다.

    • 그 후, A가 B로 더 보낼 데이터가 없다면 B가 보내준 번호+1
      값과 ACK플래그만 켠 채로 응답하면 된다.

  10. TCP가 신뢰성을 유지한채로 데이터를 전송하는 실현하는 방법은
    발신 호스트가 수신호스트에 패킷을 보낸 후, ACK플래그를 가진
    패킷을 기다린다. 수신 호스트는 해당 패킷을 받은 후엔
    ACK플래그를 기재한 패킷을 응답하는 식이다.
    만약 ACK플래그가 기재된 패킷을 발신 호스트가 받지 않는다면,
    다시 수신호스트에 패킷을 보내본다.

  11. 공인 IP란 ip주소 중 공개적으로 라우팅할 수 있다는 말로,
    공인 IP로 패킷을 보내면 이 패킷이 인터넷의 여러 라우터를 거쳐 해당 호스트에 도달할 수 있다.
    하지만 공인 IP는 32비트에 불과하므로 갯수가 43억개보다 작으므로 기기마다 일일이 부여받기는 힘들다.
    따라서 인터넷 공유기 같은 장비를 통해 서브넷의 전체 호스트를 하나의
    공인 IP로 묶어준다. 이렇게 묶어줄 때 각 호스트마다 공인 IP대신 사설 IP를 할당해주는 데, 이 사설 IP는 공인 IP로 사용되지 않는다.
    다른 사설망의 사설 IP는 겹쳐도 문제가 없다.

  12. NAT란 네트워크 주소 변환(Network Address Translation)의 약자로,
    공인 IP 하나를 여러 개의 사설 ip 주소로 나뉠 수 있다.
    이점은 네트워크 하나에 모든 호스트들에 사설 ip주소를 부여하여,
    각 호스트마다 인터넷업체를 이용하여 ip주소를 부여받지 않아도 된다.
    하지만 감수해야 할 부분은 어떤 공개 라우터도 사설 ip에는 접근할 수 없으므로, 공유기의 NAT모듈은 통과하는 ip 패킷 발신지의 사설 ip를 자신의 공인 ip 주소로 재기입해야한다.

  13. 패킷이 외부로 나가기전 공유기에 도달하면 NAT모듈이 발신자의 IP주소와 포트번호를
    NAT 테이블에 기재한다. 그후 사용한 적 없는 포트 번호 하나를 임의로 골라 같이 기재한다.
    이 임의의 포트 번호는 외부 식별용으로 사용되며 패킷이 공유기를 거쳐 나갈땐,
    공유기 공인 IP와 식별용 포트번호를 달고 나간다.
    발신자 주소가 재기입된 패킷이 서버에 도착하면 서버는 잠시 후 재기입된 주소와 포트로
    응답 패킷을 보낸다. 그 후 NAT모듈은 식별용 포트번호를 통해 원래 발신 호스트로 전달한다.

  14. STUN이란 Simple Traverssal of UDP through NAT의 약어로
    NAT의 문제점을 해결하는 방법 중 하나이다.
    NAT A에 연결된 호스트 A에 서버를 띄우고 NAT B에 연결된 호스트 B를 초대한다면
    B가 호스트 A에 연결된 적이 없기 때문에 NAT테이블에 B의 정보가 없으므로 폐기처리된다.
    이 문제점을 STUN을 통해 해결할 수 있는데, STUN을 쓰려면 각 플레이어의 호스트는
    공인 IP로 공개된 중개호스트, xbox라이브나 psn서버에 접속해야한다.
    이 중개 호스트는 라우터에 항목을 개설하기 같은 작업들을 해준다.

    • 먼저 호스트 A는 중개 호스트에 패킷을 보낸다.
      패킷이 라우터 A를 지날 때 NAT A테이블에 항목을 만들고 공인 IP와 발신자 포트를
      임의의 수로 재기입하여 보내진다.
    • 다음 호스트 B는 플레이어 A의 서버에 참가한다고 중개 호스트에게 패킷을 보낸다.
      마찬가지로 해당 패킷이 라우터 B를 지날 때 NAT B테이블에 항목 만들고 패킷을 재기입한다.
      여기서 중개호스트가 알고있는 A 의 ip와 포트번호로 B가 바로 보내면 A의 NAT테이블이
      발신자를 검사하기때문에 한번도 통신한적 없는 B의 패킷은 폐기처리해버림,
    • 따라서 중개호스트가 알고있는 B의 주소로 A가 패킷을 보내게한다.
      이 패킷은 B의 NAT테이블에 막혀 폐기처리되지만
      A의 NAT테이블에 B의 정보를 기입하는 결과를 가져온다.
    • 그 후 호스트 B가 A에게 보낸다면 A의 NAT 테이블에 B의 정보가 있으므로 패킷을 수신한다.
profile
코딩 창고!

0개의 댓글