Network Base Knowledge
Server Programming
socket, bind, listen, accept
- socket으로 클라이언트 측과 마찬가지로 소켓을 만듬
- (bind) 통신을 허가하는 IP주소와 자기 자신의 포트번호로 소켓에 정보를 등록 특정 client와만 통신을 원하면 IP주소 부분에 등록
- bind로 소켓에 값을 등록 후 listen을 호출하여 클라이언트에 접속 대기 중임을 TCP/IP 소프트웨어에 통지
- 그러면 accept를 호출하게 되고 이것으로 서버는 클라이언트로부터의 통신을 시작하는 제어패킷을 기다리게 됩니다.
다수의 클라이언트와 통신하는 방법
- 클라이언트의 시작 제어 패킷이 도착하면 응답 패킷을 서버에서 보냅니다. 이걸로 접속 동작 끝
- 서버측에서는 accept가 이 접속동작을 실행하여 끝나면 제어를 어플리케이션에 돌려주고 동시에 새로운 디스크립터를 어플리케이션에 넘겨줍니다.
- 디스크립터는 소켓을 식볋하는 것으므로 새로운 디스크립터를 넘긴다는 것은 새로운 소켓이 내부에서 만들어진다는 것입니다.
- 접속을 대기하기 위하여 만든 첫 소켓은 그대로 유지되며 다른 클라이언트의 시작 제어 패킷을 기다립니다.
- 이렇게 다수의 클라이언트와 통신할 수 있습니다.
socket
소켓의 실체는 TCP/IP 소프트웨어 내부의 메모리영역이다. 소켓을 만들때는 먼저 OS요청을 하여 소켓 하나 만큼의 메모리 영역을 확보합니다. 그 후 확보한 메모리 영역에 제어 정보를 기록해 나갑니다. 그 정보는 정의하는 프로토콜의 종류에 따라 다릅니다.
소켓을 만들고 통신할 준비가 끝나면 socket을 호출한 어플리케이션에게 디스크립터를 돌려줍니다. 디스크립터라는 것은 TCP/IP 소프트웨어 내부에 있는 다수의 소켓 중 어느것을 가리키는가 하는 정보입니다.
connection, session
서버와 클라이언트 사이의 소켓이 생성이 되면 논리적인 통로(pipe)가 만들어진다. 그 논리적인 통로를 통해서 데이터를 주고 받는다. 이를 커넥션 이라고도 하고 세션이라고도 한다.
TCP/IP
통신 순서
- 통신 개시를 알리는 제어용 패킷을 교환
- 송신 데이터를 상대로부터 수신
- 데이터를 상대에 송신
- 통신의 종료를 알리는 제어용 패킷을 교환
통신 순서 detail
[접속단계]
(->) 데이터를 보내려고 합니다.
(<-) 알았습니다. 이쪽에서 데이터를 보내겠습니다.
(->) 알았습니다.
[데이터 송.수신 단계]
(->) 데이터 송신
(<-) 수신 확인 응답 전송
[접속 종료]
(<-) 이것으로 데이터는 끝입니다.
(->) 알았습니다.
(->) 이쪽도 보내는 데이터는 없습니다.
(<-) 알았습니다.
TCP Header
20 Byte 형식의 Header 정보 TCP 프로토콜 관련 wikipdia
주요 필드
- 제어비트 (SYN (보내겠습니다.), ACK(알았습니다.))
- 송신자, 수신자의 포트번호
- 송, 수신 데이터의 일련번호
- 데이터 오프셋
IP Header
TCP Header 생성후 IP 헤더를 만들어서 그 앞에 붙입니다. 가장 중요한 것은 패킷을 어디로 보낼지를 결정하는 IP 주소입니다.
MAC 헤더
Ethernet에서 데이터를 통신을 하기 위해 필요한 정보 송신자 MAC 주소, 수신자 MAC 주소 정보가 담긴다. broadcast 후 해당 장비만 그 정보를 취하고 나머지 장비는 그 정보를 버립니다.
상대방의 MAC 주소는 어떻게 알수 있을까?
ARP (Address Resolution Protocol) 프로토콜을 통해서 획득한다. 이더넷은 보낸 신호가 모두에게 도달하므로 그 특성을 이용해서 정보를 획득한다. ‘xxx.xxx.xxx.xxx’ 주소를 가진 분 있습니까? MAC 정보를 알려주세요~ 해당 주소를 가진 장비가 본인의 MAC 정보를 응답합니다.
- MAC 헤더까지 붙이는 작업이 IP의 담당입니다.
- Layer 1,2 의 역할이라고 알고 있는 경우도 있지만 그렇지 않습니다.
LAN 카드
|Application|
|TCP/IP 소프트웨어|
|LAN 드라이버|
|확장버스 슬롯|
|LAN 카드|
in LAN card
RJ-45 커넥터 - MAU - Ethernet Controller - Buffer Memory
|
ROM
송신용 신호선, 수신용 신호선 별도로 존재
- MAU : 신호를 송,수신하는 회로를 내장
- 이더넷 컨트롤러 : 충돌 검출이나 재송등 이더넷의 송.수신 동작을 제어
- ROM : MAC 주소가 기록되어 있음
- 버퍼 메모리 : 송.수신하는 프레임을 일시적으로 보존
Packet에 붙이는 3개의 제어용 데이터
디지털 신호를 전기신호로 나타낼 때는 0,1 비트값을 일정한 전압이나 전류의 값으로 변경합니다. 이렇게 전기 신호를 디지털 데이터로 표현이 가능합니다.
- 프리앰블 : 101010…. 연속된 56비트, 타이밍을 잴수 있도록 도움
- 스타트 프레임 딜리미터(SFD) : 10101011, 프레임의 시작 위치를 선정, 8비트
- 프레임 체크 시퀀스 : 오류검출용 데이터
DNS (Domain Name System)
32bit IP주소(ipv4) 를 일일이 기억할 수 없어서 그와 매핑된 Domain을 관리하는 시스템 네트워크 통신 즉 소켓 통신시에 필요한 IP 정보획득 (port 별도)
관련용어
- Name Resolution = DNS 시스템을 이용하여 IP 주소를 알아내는 것
- DNS Resolver = Name Resolution을 수행하는 녀석 (DNS Client)
DNS Request
요청항목 | 설명 |
---|---|
이름 | 서버나 메일 배송처의 이름 |
클래스 | 이름의 클래스, 인터넷 IN 고정 |
타입 | A: 등록되어 있는 서버명 IP 회답 MX : 이름은 메일 배송처 나타냄 |
Byte Order
- 쓰이는 곳에 따라 호스트 바이트 순서, 네트워크 바이트 순서 로 나뉜다.
- 메모리는 시작주소(낮은 주소)에서 부터 끝주소(높은 주소)로 쓰인다.
Host Byte Order
- 개별 시스템이 내부적으로 데이터를 표현하는 방식
- Big-Endian, Little-Endian 으로 나뉜다.
- 시스템의 CPU에 따라서 결정된다.
Big-Endian
- IBM, ARM, Motorola
- 시작주소에 4바이트 중 제일 큰 바이트(BIG)인 0x12 값이 먼저 쓰이는 케이스
- 11이라는 Integer(4 Byte)를 읽어내기 위해서 4개 바이트를 모두 읽어야 한다.
- 상위 바이트가 메모리에 먼저 적재되는 방식
0×12345678
|0×12|0×34|0×56|0×78|
낮은주소 —> 높은주소
Little-Endian
- Intel X86, AMD, EDC
- 시작주소에 4바이트 중 제일 작은 바이트(BIG)인 0x78 값이 먼저 쓰이는 케이스
- 11이라는 Integer(4 Byte)를 읽어내기 위해서 첫번째 바이트만 읽어도 알 수 있다.
- 하위 바이트가 메모리에 먼저 적재되는 방식
0×12345678
|0×78|0×56|0×34|0×12|
낮은주소 —> 높은주소
Network Byte Order
- 네트워크 바이트 오더는
Big-Endian
만 사용한다. - Little-Endian 시스템에서는 Big-Endian 으로 변경해서 통신해야 한다.
용어정리
Loop Detection
잘못된 네트워크 연결 또는 구성으로 인해 2계층에서 루프가 생성되고
브로드 캐스트, 멀티 캐스트 또는 알 수 없는 유니 캐스트가 반복적으로 전송 될 수 있습니다.
반복되는 전송은 네트워크 리소스를 낭비 할 수 있으며 때때로 네트워크를 마비시킬 수 있습니다.
루프 감지 매커니즘은 루프가 발생할 때 즉시 로그를 생성하므로 네트워크 연결 및 구성을 조정하도록
즉시 알려줍니다. 루프 감지를 통해 루프된 포트를 종료 할 수 있습니다.
루프백이란?