챕터를 두개 같이 포스팅하겠다.
이유는 귀찮기 때문에 ㅎ
chapter2. 소켓의 타입과 프로토콜 설정
protocol 이란? -> 대화에 필요한 통신규약, 즉 네트워크 통신에 필요한 규약.
소켓 통신에서는 주로 ipv4 프로토콜 체계가 사용되고 있다.
소켓의 타입에 따라 데이터 전송 방식이 달라진다.
1. 연결지향형 소켓 (SOCK_STREAM) / TCP
- 중간에 데이터가 소멸되지 않고 목적지로 전송된다.
- 전송순서대로 데이터가 수신된다.
- 전송되는 데이터의 경계(Boundary)가 존재하지 않는다. / 데이터를 송수신하는 소켓은 내부적으로 buffer, 즉 바이트 배열을 지니고 있다. 떄문에 데이터가 수신되었다고 해서 바로 read 함수를 호출해야 하는 것은 아니다.
- 데이터의 확인 절차가 필요하기 때문에 전송속도가 느리다.
=> 신뢰성 있는 순차적 바이트기반의 연결지향 데이터 전송방식
2. 비연결지향형 소켓 (SOCK_DGRAM) /UDP
- 전송된 순서에 상관없이 가장 빠른 전송을 지향한다.
- 전송된 데이터는 손실, 파손의 우려가 있다.
- 전송되는 데이터의 경계 (Boundary)가 존재한다.
- 한 번에 전송할 수 있는 데이터의 크기가 제한된다.
=> 신뢰성과 순차적 데이터 전송을 보장하지 않는 고속의 데이터 전송을 목적으로 하는 소켓
chapter3. 소켓에 할당되는 IP주소와 Port 번호
인터넷 주소란? -> 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소.
- 4byte 주소 체계인 IPv4와 16byte 주소체계인 IPv6가 존재한다.
IP : 네트워크 주소 + 호스트 주소
- 네트워크를 찾는다 = 라우터 장비를 찾는다.
네트워크 주소가 203.211.27 라고 하면 이것은 라우터의 주소를 의미한다.
네트워크ID는 같은 라우터를 사용하는 컴퓨터들이 공유하고 있고, 그 중 어떤 호스트(=컴퓨터)에 접근할 지는 호스트 주소를 통해 결정한다.
IP주소중 먼저 네트워크ID를 참조해서 라우터로 접근
-> 라우터에서 호스트 ID를 참조하여 맞는 호스트에게 데이터를 전달한다.
PORT 번호
-IP는 컴퓨터를 구분하는 용도로 사용되며, PORT는 소켓을 구분하는 용도로 사용된다.
-하나의 프로그램 내에서는 둘 이상의 소켓이 존재할 수 있으므로, 둘 이상의 port가 하나의 프로그램에 의해 할당 될 수 있다.
- port 번호는 16비트로 표현된다 (0이상 65535 이하)
- 0~1023은 잘 알려진 PORT라 해서 이미 용도가 결정되어 있다.
*IPv4기반의 주소표현을 위한 구조체
struct sockaddr_in
- sin_family : 주소체계 정보 저장
- sin_port : 16비트 port번호 저장, 네트워크 바이트 순서로 저장
- sin_addr : 32비트 ip주소정보 저장, 네트워크 바이트 순서로 저장
- sin_zero : 특별한 의미를 지니지 않지만, ipv4의 데이터 구조로 맞춰주기 위해 0으로 초기화 되는 변수를 지정하는것.
*네트워크 바이트 순서와 인터넷 주소 변환
같은 데이터 타입이어도 cpu에 따라 데이터를 저장하는 방식이 달라질 수 있다.
* Big Endian vs Little Endian
- 빅 엔디안 : 상위 바이트 값을 작은 번지수에 저장한다.
- 리틀 엔디안 : 상위 바이트 값을 큰 번지수에 저장한다.
데이터 저장 방식이 다른 두 컴퓨터가 네트워크 통신을 할 때 문제가 발생 할 수 있기 때문에
통신에 있어서는 Big Endian 방식으로 통일한다.
하지만 소켓 통신을 할 때는 자동으로 변환이 되지만, 소켓을 생성하는데 필요한 데이터 (ex. port번호)는 변환이 필요하다.
'Golang > etc' 카테고리의 다른 글
tcp/ip 05 (0) | 2022.07.03 |
---|---|
tcp/ip 04 (0) | 2022.06.28 |
tcp/ip - 01 (0) | 2022.06.22 |
Golang Apple Login (애플 로그인) (0) | 2022.06.14 |
Apple 로그인 JWT, JWK (1) | 2022.06.14 |