tcp/ip 스택계층의 주요 5계층은
물리 계층, 링크 계층, 네트워크 계층, 전송 계층, 응용 계층으로 되어 있다.
ARP란 주소 결정 프로토콜(adress resolution protocol)로
IP주소를 이에 대응하는 MAC주소로 변환해준다.
ARP 는 두 부분으로 구성되어 있으며 NIC가 어떤 MAC주소에 대응되는지
질의하는 패킷구조이고, 하나는 짝을이루는 NIC주소와 MAC주소쌍을 정리해둔 표다.
라우터란 서로다른 서브넷을 연결하는 호스트로, 하나의 라우터에 여러 개의 NIC가 여러 개 장착되며, 각 NIC마다 고유 ip주소가 할당되어 있다.
이를 서브넷 마스크를 통해 비트 AND연산으로 같은 값이 나오는 ip주소로
네트워크인지를 구별한다.
각 호스트의 ip 모듈은 라우팅 테이블을 보유하여 서브넷당 패킷 전달에 이용한다.
원격 호스트에 ip패킷을 보내도록 어떤 호스트의 ipv4모듈에 요청하면
라우팅 테이블을 참조하는데, 라우팅 테이블엔 도달 가능한 목적지 서브넷마다 패킷을 어떻게 전달할지에 대한 정보가 한 줄씩 기록되어있다.
MTU란 최대 전송 유닛(Maximum Transmission Unit)의 약자로
이더넷 패킷 한 번 전송에 최대한 담을 수 있는 데이터의 양을 뜻한다.
이더넷 표준은 페이로드의 최대 길이를 1500바이트로 정의하고 있다.
보내야 하는 원래 패킷 헤더의 분열 식별자, 분열 플래그, 분열 오프셋 값은 0으로 정해져 있다.
두 개의 패킷으로 나웠을 때,
두 개의 패킷의 페이로드 값은 헤더 길이때문에 최대 380이다.
두 개의 패킷의 분열 식별자는 같은 숫자로 설정되어 있다.
분열 플래그는 마지막 조각외의 모든 조각에 0x04로 설정되어 있고,
나머지 조각에 0으로 설정되어 있다.
따라서 둘로 나뉜 조각 중 첫번째 조각에 0x04,
두번째 조각에 0으로 설정되어 있다.
분열 오프셋은 필드는 8바이트 블록 단위로 해야하므로,
첫 번째 패킷 오프셋은 380/8=47.5
두 번째 패킷 오프셋은 95로 설정된다.
ip패킷 계층에서 분열이 일어나지 않도록 피해야하는 이유는
헤더 길이 때문에 실제 네트워크를 통해 보내는 데이터양이 늘어난다.
조각이 하나라도 없어진다면 다른 조각을 전부 버려야하므로,
조각 수가 많을수록 손해가 크다.
각 패킷마다 헤더의 길이인 20바이트가 필요하므로 자주 보낼수록
비효율적이다. 따라서 한번 보낼때 최대한 크게 보내야한다.
비신뢰성 데이터 전송은 데이터의 순서나 전달을 보장해주지 않는 전송이고, 신뢰성 데이터 전송은 이런 부분들을 다 보장해준다.
호스트 A와 B사이에서 핸드셰이킹이 일어난다고 해보자.
A에서 B로 첫번째 세그먼트를 보내서 연결을 시도한다.
SYN플래그가 설정되어 있고, 초기 시퀀스번호를 임의로 1000으로 설정한다.
B가 연결을 받을 수 있는 상황이면,
SYN,ACK플래그를 켜진 패킷으로 응답한다.
이때 응답패킷의 ACK번호는 호스트 A가 보내준 번호 +1로 보낸다.
그 후, B가 A로 보내는 시퀀스 번호는 임의로 B가 고르는데
임의로 3000으로 한다.
그 후, A가 B로 더 보낼 데이터가 없다면 B가 보내준 번호+1
값과 ACK플래그만 켠 채로 응답하면 된다.
TCP가 신뢰성을 유지한채로 데이터를 전송하는 실현하는 방법은
발신 호스트가 수신호스트에 패킷을 보낸 후, ACK플래그를 가진
패킷을 기다린다. 수신 호스트는 해당 패킷을 받은 후엔
ACK플래그를 기재한 패킷을 응답하는 식이다.
만약 ACK플래그가 기재된 패킷을 발신 호스트가 받지 않는다면,
다시 수신호스트에 패킷을 보내본다.
공인 IP란 ip주소 중 공개적으로 라우팅할 수 있다는 말로,
공인 IP로 패킷을 보내면 이 패킷이 인터넷의 여러 라우터를 거쳐 해당 호스트에 도달할 수 있다.
하지만 공인 IP는 32비트에 불과하므로 갯수가 43억개보다 작으므로 기기마다 일일이 부여받기는 힘들다.
따라서 인터넷 공유기 같은 장비를 통해 서브넷의 전체 호스트를 하나의
공인 IP로 묶어준다. 이렇게 묶어줄 때 각 호스트마다 공인 IP대신 사설 IP를 할당해주는 데, 이 사설 IP는 공인 IP로 사용되지 않는다.
다른 사설망의 사설 IP는 겹쳐도 문제가 없다.
NAT란 네트워크 주소 변환(Network Address Translation)의 약자로,
공인 IP 하나를 여러 개의 사설 ip 주소로 나뉠 수 있다.
이점은 네트워크 하나에 모든 호스트들에 사설 ip주소를 부여하여,
각 호스트마다 인터넷업체를 이용하여 ip주소를 부여받지 않아도 된다.
하지만 감수해야 할 부분은 어떤 공개 라우터도 사설 ip에는 접근할 수 없으므로, 공유기의 NAT모듈은 통과하는 ip 패킷 발신지의 사설 ip를 자신의 공인 ip 주소로 재기입해야한다.
패킷이 외부로 나가기전 공유기에 도달하면 NAT모듈이 발신자의 IP주소와 포트번호를
NAT 테이블에 기재한다. 그후 사용한 적 없는 포트 번호 하나를 임의로 골라 같이 기재한다.
이 임의의 포트 번호는 외부 식별용으로 사용되며 패킷이 공유기를 거쳐 나갈땐,
공유기 공인 IP와 식별용 포트번호를 달고 나간다.
발신자 주소가 재기입된 패킷이 서버에 도착하면 서버는 잠시 후 재기입된 주소와 포트로
응답 패킷을 보낸다. 그 후 NAT모듈은 식별용 포트번호를 통해 원래 발신 호스트로 전달한다.
STUN이란 Simple Traverssal of UDP through NAT의 약어로
NAT의 문제점을 해결하는 방법 중 하나이다.
NAT A에 연결된 호스트 A에 서버를 띄우고 NAT B에 연결된 호스트 B를 초대한다면
B가 호스트 A에 연결된 적이 없기 때문에 NAT테이블에 B의 정보가 없으므로 폐기처리된다.
이 문제점을 STUN을 통해 해결할 수 있는데, STUN을 쓰려면 각 플레이어의 호스트는
공인 IP로 공개된 중개호스트, xbox라이브나 psn서버에 접속해야한다.
이 중개 호스트는 라우터에 항목을 개설하기 같은 작업들을 해준다.