Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Value too long for column
- addhooks
- JanusWebRTC
- VARCHAR (1)
- JanusGateway
- table not found
- PytestPluginManager
- pytest
- 달인막창
- 개성국밥
- kotlin
- 코루틴 컨텍스트
- 오블완
- PersistenceContext
- python
- 티스토리챌린지
- terminal
- JanusWebRTCGateway
- Spring Batch
- JanusWebRTCServer
- 코루틴 빌더
- tolerated
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- vfr video
- taint
- 자원부족
- 깡돼후
- 겨울 부산
- preemption #
- mp4fpsmod
Archives
너와 나의 스토리
[실습] 주소체계와 데이터 정렬 - IP주소/PORT번호/주소정보 표현/인터넷 주소(Internet Address) 본문
Computer Networks/실습
[실습] 주소체계와 데이터 정렬 - IP주소/PORT번호/주소정보 표현/인터넷 주소(Internet Address)
노는게제일좋아! 2019. 9. 25. 22:59반응형
IP주소와 PORT 번호
인터넷 주소(Internet Address)
인터넷에 컴퓨터를 연결해서 데이터를 주고받기 위해서는 IP 주소를 부여 받아야 한다.
-
- 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
- 이러한 IP 주소체계는 IP 주소의 표현에 사용되는 바이트 크기에 따라 다음과 같이 두 종류로 나뉜다.
- IPv4(Internet Protocol version 4) - 4 바이트 주소 체계
- IPv6(Internet Protocol version 6) - 16 바이트 주소 체계
- 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다.
- 네트워크 주소와 호스트 주소로 나뉜다. 네트워크 주소를 이용해서 네트워크를 찾고, 호스트 주소를 이용해서 호스트를 구분한다.
- WWW.SEMI.COM이라는 회사의 사람에게 데이터를 전송한다고 가정해보자. 처음에는 4바이트를 전부 참조하는 것이 아니라 네트워크 주소(1byte)만 참조해서 일단 SEMI.COM의 네트워크로 데이터가 전송된다. 그 후, 해당 네트워크(네트워크를 구성하는 라우터)는 전송된 데이터의 호스트 주소(호스트 ID)를 참조하여 그 사람의 컴퓨터에 데이터를 전송해준다.
클래스 별 네트워크 주소와 호스트 주소의 경계
때문에 첫 번째 바이트 정보만 참조해도 IP 주소와 클래스 구분이 가능하며, 이로 인해서 네트워크 주소와 호스트 주소의 경계 구분이 가능하다.
IP 주소
- network address라고도 한다.
- 데이터가 전송될 목적지 호스트를 알려주는 역할을 한다.
- 사람은 주소를 숫자로 구분하는 것보다 이름으로 구분하는 것이 더 편하므로 시스템에는 IP 주소 외에 호스트명을 지정한다. 인터넷에서 사용하는 호스트명은 '호스트명+도메인명' 형태로 구성된다. 예를 들어 호스트명이 www.hanb.co.kr인 시스템이이 있을 때, www는 호스트명, hanb.co.kr은 도메인명이 된다.
- 호스트명과 도메인명을 관리하는 시스템을 DNS(Domain Name System)이라고 한다.
PORT 번호 - 소켓의 구분에 활용
- IP는 컴퓨터를 구분하는 용도로 사용되며, PORT 번호는 소켓을 구분하는 용도로 사용된다.
- 하나의 프로그램 내에서는 둘 이상의 소켓이 존재할 수 있으므로, 둘 이상의 PORT가 하나의 프로그램에 의해 할당될 수 있다.
- PORT번호는 16비트로 표현, 따라서 그 값은 0~65535
- 0~1023은 잘 알려진 PORT라 해서 이미 용도가 결정되어 있다.
주소정보의 표현
IPv4 기반의 주소표현을 위한 구조체
struct sockaddr_in
{
sa_family_t sin_family; // 주소체계(Address Family)
uint16_t sin_port; // 16비트 TCP/UDP PORT 번호
struct in_addr; // 32비트 IP 주소
char sin_zero[8]; // 사용되지 않음
}
-> bind 함수에 주소정보를 전달하는 용도로 사용됨
struct in_addr
{
in_addr_t s_addr; // 32비트 IPv4 인터넷 주소
}
구조체 sockaddr_in의 멤버에 대한 분석
- sin_family
- 주소체계 정보 저장
- sin_port
- 16비트 PORT번호 저장
- 네트워크 바이트 순서로 저장
- sin_addr
- 32비트 IP주소정보 저장
- 네트워크 바이트 순서로 저장
- sin_addr의 구조체 자료형 in_addr은 사실상 32비트 정수 자료형
- sin_zero
- 특별한 의미를 지니지 않는 멤버
- 반드시 0으로 채워야 한다. -> 이유 중요!
구조체 sockaddr_in 활용
sockaddr_in 구조체가 인자로 전달되는데 이 때, sockaddr 타입으로 형 변환을 해줘야 한다.
* sockaddr_in은 IPv4(프로토콜 체계 중 하나)의 주소정보를 담기 위해 정의된 구조체인데, 왜 sin_family에 주소체계를 하나 더 만들어서 정의해줄까?
답: sockaddr에서 주소체계를 따로 요구하므로 쉽게 변환하기 위해서
네트워크 바이트 순서와 인터넷 주소 변환
4바이트로 정수 1을 저장하는 방법
- [00000000 00000000 00000000 00000001] 이렇게 메모리에 저장하는 CPU도 있지만
- [00000001 00000000 00000000 00000000] 이렇게 반대로 메모리에 저장하는 CPU도 있다.
- 즉, CPU마다 데이터를 표현 및 해석하는 방식이 다르다.
바이트 순서(Order)와 네트워크 바이트 순서
- 빅 엔디안(Big Endian)
- 상위 바이트의 값을 작은 번지수에 저장
- 리틀 엔디안(Little Endian)
- 상위 바이트의 값을 큰 번지수에 저장
- 호스트 바이트 순서
- CPU별 데이터 저장방식을 의미
- 네트워크 바이트 순서
- 통일된 데이터 송수신 기준을 의미함 -> 데이터 보내는 순서를 통일
- 빅 엔디안이 기준이다
바이트 순서 변환하기
- 리눅스에서 long형은 4바이트
- htons: short형 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환하라
인터넷 주소의 초기화와 할당
문자열 정보를 네트워크 바이트 순서의 정수로 변환
- "211.214.107.99"와 같이 점이 찍힌 10진수로 표현된 문자열을 이 함수의 인자로 넣으면, 32비트 정수형으로 변환해준다.
- sockaddr_in 안에서 주소정보를 저장하기 위해 선언된 멤버는 32비트 정수형으로 정의되어 있어서 위 함수를 통해 평소 우리가 쓰는 ip 주소 표현을 32비트 정수형으로 바꿔서 저장해야한다.
inet_aton
- inet_addr 함수처럼 문자열 변환한 후, addr에 결과 저장
inet_ntoa
- inet_aton함수의 반대기능 제공
- 정수형 IP 주소 정보를 우리가 쉽게 볼 수 있는 문자열 형태로 변환한 뒤, 변환된 문자열의 주소 값을 반환한다.
인터넷 주소의 초기화
- 서버에서 주소정보를 설정하는 이유?
- IP 211.217.168.13, PORT 9190으로 들어오는 데이터는 내게로 다 보내라!
- IP 211.217.168.13, PORT 9190으로 연결을 해라!
INADDR_ANY
- 현재 실행중인 컴퓨터의 IP를 소켓에 부여할 때 사용되는 것이다.
- 서버 프로그램의 구현에 주로 사용된다.
출처: [열혈 TCP/IP 소켓 프로그래밍]
반응형
'Computer Networks > 실습' 카테고리의 다른 글
주소 할당 에러의 원인 - Time wait과 SO_REUSEADDR 옵션 (0) | 2019.11.08 |
---|---|
[CH.4-2,3] TCP기반 서버, 클리이언트의 구현 - Iterative 기반으로 구현 (0) | 2019.10.09 |
[CH.4-1] TCP와 UDP에 대한 이해 (0) | 2019.10.09 |
리눅스 기반 파일 조작하기 (0) | 2019.09.25 |
[실습] 네트워크 프로그래밍과 소켓 - 소켓 인터페이스, 서버 클라이언트 연결 (0) | 2019.09.05 |
Comments