각 계층별 프로토콜의 역할

매일 공부(ML)·2023년 3월 19일
0

Fluent Python

목록 보기
95/130

리눅스 환경 구축 - WSL활성
윈도우 WSL을 이용해서 구축해 보기
커멘드(관리자)창을 통해서 리눅스 서브시스템 지원 활성화

WSL 2를 사용하기 위해 윈도우 업데이트 설치

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
WSL의 기본 버전을 2로 변경하고, MS스토어에서 우분투, 윈도우 터미널 설치

wsl --set-default-version 2
apt-get 패키지들
sudo apt update
sudo apt install git zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

네트워크 디바이스와 드라이버(이더넷)
네트워크 디바이스
NIC(Network Interface Controller)
네트워크 장비와 LAN 사이의 통신을 준비하고 전송될 데이터를 병렬에서 직렬로 전환합니다.

빠른 전송을 위해서 데이터를 코딩화 및 압축을 진행하고 목적지 장비의 NIC는 데이터를 수신하고 CPU로 데이터를 전달합니다.

Access Control 기능이 구현된 한드웨어 펌웨어가 들어 있습니다.

연결 방식
유선 혹은 무선으로 설계가 가능하고, 이더넷, 기가비트 이더넷, 광섬유, 토큰링등이 있습니다.

네트워크 칩의 예
CS8900A의 특징

위의 이미지를 보면 정말 복잡하게 구성이 되고 있다는 생각이 들지 않나요? 이 이미지의 기능들에 대해서 설명을 해드리겠습니다.

Cyrus Logic에서 개발된 10Mps를 지원하는 Ethernet Controller로 IEEE 802.3 기준을 따르고 Direct ISA-BUS 연결을 사용합니다.

10BASE-T와 10BASE2, 10BASE5, 10BASE-F를 지원하기 위한 AUI(Attachment Unit Interface)를 가지고 있고, disk가 없는 시스템의 booting을 위해선 Boot PROM 지원됩니다.

Tx시에는 collision이 있을 시 자동적인 재전송 및 Padding과 CRC 생성을 해주고 Rx시에는 CPU의 overhead를 줄이기 위해서 StreamTransfer를 제공한다.

I/O 및 메모리 공간과 DMA slave로서 동작할 때 사용하기 위한 Packet Page로 EEPROM을 제공하여 점퍼 설정을 최소화한 설정이 가능합니다.

CSMA/CD 기본 알고리즘

CSMA/CD 두가지 옵션

이더넷 계층 구조
이더넷 계층구조

LLC:흐름제어와 오류 제어를 담당합니다.

MAC: CSMA/CD 접근 방법에 대한 동작을 담당합니다.

이더넷 프레임(Frame) 포멧

한 번에 보내는 적절한 프레임 바이트 수가 CS8900A 메모리에 전송되고 네트워크에 접속할 수 있게 합니다.
MAC는 Start-of-Frame Delimiter(SFD)뒤에 7byte preamble을 전송합니다.
SFD와 FCS 사이의 데이터는 host에서 공급이 되기에 CS8900A가 제공하는 FCS 생성기는 inhibitCRC bit가 set 됨에 따러 비활성 됩니다.
프레임의 길이와 데이터의 길이

칩의 레지스터
레지스터의 기본적인 접근 방법
PacketPage Pointer port를 통해서 접근하고, 기본주소에 0x000A를 더해서 결정이 되고, 레지스터에 있는 데이터를 읽기 위해서는 이 {acketPage Pointer Port에 먼저 레지스터의 offset을 쓰고 나서, data port를 통해서 읽어 옵니다.

쓰는 것도 역시 PacketPage Pointer Port에 먼저 레지스터의 offset을 쓰고 나서, data port에 쓸 내용을 적어서 처리합니다

Packet Page Address

Bus Interface Registers

ISA 버스를 이용해서 호스트시스템 혹은 I/O 메모리에 매핑이 되고, 초기 설정 후 작동 중에는 변경하지 않는다.

Status and Control Registers

레지스터의 상태를 얻거나 주요 제어를 한다.

Initiate Transmit Registers

이더넷 프레임을 전송할 때 초기화 시 사용한다.

Address Filter Registers

원격 주소 필터에 의해 사용된다

Receive and Transmit Frame Locations

이더넷 프레임을 호스트로부터 전송할 때 사용한다.

Packet Page 접근 예제
Packet Page Pointer Port Register를 통해 접근하는 방법
extern int inline readreg(struct net_device dev, int portno)
{
outw(portno, dev->base_addr + ADD_PORT);
return inw(dev->base_addr + DATA_PORT);
}
extern void inline writereg(struct net_device
dev, int portno, int value)
{
outw(portno, dev->base_addr + ADD_PORT);
outw(value, dev->base_addr + DATA_PORT);
}
커널의 Network Subsystem

커널 부팅과 네트워크 디바이스 드라이버
커널 초기화 과정
네트워크 디바이스 드라이버가 커널에 올라가서 동작을 대기 합니다.

등록된 네트워크 디바이스 드라이버의 확인
cat /proc/net/dev

Receive, Transmit의 bytes, packets, errs, drop fifo frame..
ifconfig명령
네트워크 디바이스를 활성화 하거나 비활성화 합니다.

inconfig [interface][ip] [netmask mask][up | down]
네트워크 요소
인터페이스 이름
lo,dummy0, eth0등과 같은 별칭을 사용하고, lo는 루프백 어드레스로 127.0.0.1의 사용을 위한 논리적인 소프트웨어 주소이다.

인터페이스 타입
ehternet, isdn, adsl과 같은 네트워크 형태로 ifconfig -a 명령 시 Link encap 항목에서 확인됩니다.

하드웨어 주소
이더넷 하드웨어 MAC주소입니다.

네트워크 주소
TCP/IP에서 사용을 위한 IP 주소입니다.

데이터 처리 능력
한 프레임을 전송항 수 있는 데이터 량을 MTU라고 하고, 패킷을 전송할 때 분할 기준으로 송신 시 네트워크 디바이스가 바쁠 때 시스템에 대기할 수 있는 큐의 크기는 txqueuelen으로 표시됩니다.

네트워크 소켓
네트워크는 소켓(Socket)으로 관리
소켓이라는 단일한 인터페이스로 묶어서 사용을 하고 네트워크를 초기화하여 다양한 통신 수단을 사용합니다.

운영체제의 파일 시스템과 연동하여 구성이 되고 상위에서 보면 파일처럼 다루어지게 되고, 소켓에서는 socket()과 bind()라는 시스템콜 함수를 이용합니다.

소켓(Socket)의 구현 정보
소켓 프로그램에 있어서 로컬 호스트에서 실행되는 프로세스와 원격 호스트에서 실행되는 프로세스 간에 데이터를 교환하기 위해서 요구되는 정보이고 종류는 프로토콜 식별자, 로컬 인터넷 주소, 로컬 포트 번호, 원격 인터넷 주소, 원격 포트번호로 구성됩니다.

이렇게 구성된 네트워크 드라이버는 주소설정, 전송 매개변수 변경, 소통량과 오류통계 유지와 같은 상당수의 관리 작업을 지원하도록 설계 되어야 합니다.

사례: 리눅스 운영체제의 net_device구조체

리눅스의 구현된 초기화 함수들
새로 작성하지 않을 경우
네트워크 인터페이스를 제어하는 디바이스 드라이버를 새로 작성할 경우 할당 등의 함수를 사용하여 구현해야 하지만 리눅스에서는 자주 사용되는 인터페이스들이 이미 구현되어 있다.

ether_setup: 이더넷 인터페이스 초기화 함수
fc_setup: 광채널 인터페이스 초기화 함수
fddi_setup: 광통신 인터페이스 초기화 함수
hippi_setup: 고성능 병렬 인터페이스 초기화 함수
ltalk_setup: 애플토크 인터페이스 초기화 함수
tr_setup: 토큰링 인터페이스 초기화 함수
할당과 셋업을 동시에 할 때

struct net_device alloc_etherdev(int sizeof_priv): 이더넷
struct net_device
alloc_fcdev(int sizeof_priv):광채널
struct net_device alloc_fddidev(int sizeof_priv):광통신
struct net_device
alloc_hippidev(int sizeof_priv):고성능 병렬
struct net_device *alloc_trdev(int sizeof_priv):토큰링
네트워크 디바이스 드라이버와 커널의 역할 예

Layer model: data structure level
VFS layer struct file_operations / include/linux/fs.h /
BSD socket layer struct net_proto_family / include/linux/net.h / struct socket / include/linux/net.h /
inet layer struct sock / include/net/sock.h / struct proto_ops / include/linux/net.h /
transport layer struct tcp_opt / include/net/sock.h / struct proto / include/net/sock.h /
network layer struct tcp_func / include/net/tcp.h / struct packet_type / include/linux/netdevice.h /
device layer struct device / include/net/netdevice.h /
소켓 데이터 구조의 흐름

소켓의 생성 및 생성 후
Socket Buffer
<linux/skbuff.h>에 정의된 sk_buff 구조체의 주요 필드
소켓 버퍼는 버퍼를 주고 받을 dev를 지정하는 필드를 갖고 있다.
struct net_device dev;
패킷에서 자료 주소를 지정하는데 사용하는 포인터
unsigned char
head;
unsigned char data;
unsigned char
tail;
unsigned char *end;
사용 가능한 주소 영역
skb->end - skb->head
사용 중인 자료 영역
skb->tail - skb ->data
패킷의 전체길이와 개별길이를 나타낸다.
unsigned int len;
unsinged int data_len;
체크섬 정책을 위한 필드
unsigned char ip_summed;
전송에 사용하는 패킷의 분류로 PACKET_HOST(나를 위한 패킷), PACKET_OTHERHOST, PACKET_BROADCAST, PACKET_MULTICAST
unsigned char pkt_type;

struct sk_buff

데이터 송수신

profile
성장을 도울 아카이빙 블로그

0개의 댓글