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 도 있음.
'Network' 카테고리의 다른 글
[인강/윤성우/TCP/IP 소켓 프로그래밍] UDP기반 서버/ 클라이언트 (0) | 2022.03.02 |
---|---|
[인강/윤성우/TCP/IP 소켓 프로그래밍] TCP기반 서버/ 클라이언트 (0) | 2022.02.25 |
[인강/윤성우/TCP/IP 소켓 프로그래밍] 소켓 타입과 프로토콜의 설정 (0) | 2022.02.24 |
[인강/윤성우/TCP/IP 소켓 프로그래밍/정리] 윈도우 기반 소켓과 구현 (0) | 2022.02.20 |
[인강/윤성우/TCP/IP 소켓 프로그래밍/정리] 리눅스 기반 파일 조작 (0) | 2022.02.20 |