728x90

IP 와 PORT

IP(Internet Address)

- 인터넷상에서 컴퓨터를 구분기 위한 목적

- 4바이트 주소체계 IPv4, 16바이트 주소체계 IPv6.

- 네트워크 주소와 호스트 주소로 나뉜다. 네트워크 주소를 이용해서 네트워크를 찾고, 호수트 주소를 이용해서 호스트를 구분한다.

 

클래스 별 네트워크 주소와 호스트 주소의 경계

 

클래스 a의 첫번쨰 비트는 항상 0

클래스 b의 첫 두 비트는 항상 10

클래스 c의 첫 세 비트는 항상 110

 

Port번호

- IP는 컴퓨터를 구분하는 용도로 사용되며, PORT번호는 소켓을 구분하는 용도(프로세스를 구분하는 용도가 아님)로 사용된다.

- 하나의 프로그램 내에서는 둘 이상의 소켓이 존재할 수 있으므로 둘 이상의 Port가 하나의 포르그램에 의해 할당될 수 있다.

- PORT번호는 16비트로 표현되며 0~65535이하 

- 0~1023은 Well-known Port 라 해서 이미 용도가 결정되어 있다.

 

[데이터 수신 -> 랜카드 cpu에 인터럽트 -> cpu 운영체제를 통해서 port에 맞는 소켓 확인 -> 소켓 버퍼에 데이터 넣어줌]

 

주소정보의 표현

 

주소 정보를 보관하는 구조체

sockaddr : 다양한 주소 구조체를 담을 수 있는 구조체 

sockaddr_in : ipv4용 

 

sockaddr_in

sin_familay : 주소 체계

sin_port : 16비트 포트. 네트워크 바이트 순서

sin_addr : 23비트 ip주소 정보 저장. 네트워크 바이트 순서 저장.

sin_zero : 0로 채워야 함 (그래서 구조체 세팅 시 최초에 memset을 통해서 0으로 밀고 시작 하는게 편함)

 

네트워크 바이트 순서와 인터넷 주소 변환

 

네트워크 통신하는 두 호스트가 데이터를 해석하는 순서가 다르면 정확하게 송수신 할 수 없다.

때문에 네트워크 할 때는 바이트 오더를 일치 시켜야 한다.

 

네트워크 상에서 바이트 오더를 네트워크 바이트 오더라고 한다. 네트워크 바이트 오더는 빅엔디안을 따른다.

 

호스트 바이트 순서 : CPU별 데이터 저장방식을 의미함. (대개 리틀 엔디안)

네트워크 바이트 순서 : 빅엔디안.

 

통신을 위해선 네트워크 바이트 순서를 기준으로 맞춘다. 

 

주의! 소켓이 생성 된 이후의 read, write 시에는 알아서 바이트 오더가 변환 돼서 신경 쓸 필요 없지만, 소켓을 생성할 때는 명시적으로 네트워크 바이트 오더에 맞게 데이터를 입력 해줘야 한다.

 

바이트 순서 변환 함수

=> cpu가 어떤 네트워크 바이트 오더와 동일 하면 동일한 값을 그대로 반환하고, 그게 아니라면 네트워크 바이트 오더에 맞게 변환한다.

htons : host byte order 를 network byte order로 바꾸고 shor를 반환 해라. port가 16비트 이므로 s 반환 버전을 쓴다.

ntohs : port가 16비트 이므로 s 반환 버전을 쓴다.

htonl 

ntohl 

 

인터넷 주소의 초기화와 할당

서버는 자신의 ip와 port를 할당

클라이언트는 접속할 대상(서버)의 ip와 port를 할당. (그러면 클라는 본인의 주소를 등록 안 하나? connect할 때 자동으로 된다)

 

함수

inet_addr(문자열) : 문자열 ip를 입력하면 네트워크 바이트 순서의in_addr_t로 반환한다

inet_aton(문자열, 저장 대상) : 문자열 ip를 inet_addr와 같이 변환하여 저장까지 하는 기능. 

inet_ntoa(대상) : 구조체 멤버의 ip 정보 변수를 문자열 형태 ip로 반환.

 

inddr_any

서버의 본인의 ip는 바꿀 수 없다. 그래서 고정적으로 등록할 필요가 있는데 서버 컴퓨터가 여러개의 ip 주소를 갖을 수도 있기 때문에 inndr_any를 통해서 해당 ip를 모두 등록할 수 있다.

 

127.0.0.1

= 자기 자신 주소. 루프백 주소.

 

주소할당

bind 함수 (서버 사이드)

 

윈도우 기반으로 구현하기

 

WSAStringToAddress  : 표면적으로 inet_addr과 비슷해 보이나 inet_addr는 ipv4로 기능이 제한되는 반면, 이 함수는 IPv6 기반에서도 사용 가능. 좀 더 기능이 확장 됐다고 생각하면 된다. 쓰다 보면 윈도우에 의존적인 코드가 된다..

 

WSAAddressToString 도 있음.

 

 

 

728x90

+ Recent posts