IOT - 4주차 1

강준호·2024년 3월 26일
0

IOT

목록 보기
3/13

Lec 07

1. TCP 서버에 대한 기본 함수 호출

소켓 프로그래밍에 필요한 기초 지식을 강조하면서 socket() 함수와 그 인수를 소개합니다.

2. "Hello World" 서버 코드 - Linux 버전

데이터 구조 정의와 함께 주소 변환 및 소켓 인터페이스를 위한 헤더 파일을 포함하여 Linux 환경에서 서버 코드를 사용하여 "Hello World" 메시지를 보내는 방법을 보여줍니다.

3. "Hello World" 클라이언트 코드 - Linux 버전

Linux 설정에서 "Hello World" 메시지를 수신하기 위한 클라이언트 측 코드를 제공합니다.

4. 소켓 프로토콜 및 데이터 전송 특성

프로토콜의 이해, 소켓 생성 시 기본 프로토콜 지정의 필요성, 도메인, 유형, 프로토콜과 같은 매개변수가 프로토콜 정보와 어떻게 관련되는지에 대해 논의합니다.

5. 프로토콜 시스템(프로토콜 제품군)

소켓 프로그래밍 학습을 위한 기반으로 IPv4 인터넷 프로토콜 시스템(PF_INET)에 초점을 맞춘 프로토콜 제품군에 대한 설명입니다.

6. 소켓 유형

연결 지향 및 비연결 소켓 유형을 포함한 소켓 유형 및 데이터 전송 방법에 대한 설명입니다.

7. 소켓 유형 비교

TCP(연결 지향) 소켓과 UDP(연결 없는) 소켓을 자세히 비교하여 데이터 전송 특성, 신뢰성, 순서, 경계 및 연결 구조를 강조합니다.

8. 프로토콜 마무리

IPv4 인터넷 프로토콜 시스템에서 소켓 생성을 위한 프로토콜 선택에 대한 설명, TCP와 UDP 소켓을 구별하고 프로토콜이 본질적으로 처음 두 인수에 의해 결정되는 경우 세 번째 인수는 0이 될 수 있다는 점에 유의합니다.

9. 연결 지향 소켓: TCP 소켓 예

데이터 전송(tcp_server.c) 및 수신(tcp_client.c)을 위한 코드 조각을 포함하여 TCP 소켓 전송에서 데이터 경계가 없음을 보여주는 실제 예입니다.

  • write 로 메세지를 전송. TCP 는 스트림으로 보내기때문에, 여러번 쪼개서 보내.
  • 받을때는 쪼개진거 여러개를 묶어서 하나만 받아.(loop 로 모아서)

10. Windows에서의 이해와 검증

앞에서 언급한 개념과 예를 Windows 운영 체제에 적용하여 프로토콜 표준과 소켓 유형 특성이 다양한 OS 플랫폼에서 일관되게 유지된다는 점을 강조합니다.


Lec08

1. 주소 표현과 bind() 함수 소개

이 장은 소켓 내에서 주소가 표현되는 방식, 인터넷 주소 초기화의 중요성에 대한 소개로 시작하여 소켓을 특정 로컬 IP 주소 및 포트와 연결하는 데 중요한 bind() 함수에 대해 논의합니다. 숫자.

2. 인터넷 주소 이해(IPv4 및 IPv6)

  • IP 주소의 첫번째만 보면 클래스 A 인지 B 인지 C 인지 알수 있음

인터넷 주소에 대해 자세히 설명하고 네트워크에서 컴퓨터를 고유하게 식별하는 목적을 설명하며 4바이트 IPv4 시스템과 16바이트 IPv6 시스템을 구별합니다. 또한 인터넷 주소를 네트워크 주소와 호스트 주소로 구분하여 네트워크 식별 및 호스트 구별을 돕는 방법에 대해 설명합니다.

3. 소켓 식별에서 포트 번호의 역할

  • 하나의 프로그램에서 둘 이상의 소켓이 존재할 수 있음으로!
  • dst 포트만 보고 보낼 수 있는가? => 소스IP 소스 port 까지 봐야해. TCP demultiplexing
  • 동일한 프로그램 내에서 소켓을 구별할 때 포트 번호의 중요성을 다루며, 포트 번호의 길이는 16비트이며 0에서 65535 사이의 범위를 허용한다는 점을 강조합니다.
  • 포트 0부터 1023까지는 이미 잘 알려진 포트입니다. 특정 용도가 할당되었습니다.

4. 주소정보 표현

  • 각각 2바이트 2바이트 4바이트 8바이트.

=> sockaddr은 다양한 주소체계의 주소정보를 담을 수 있도록 먼저 정의되었다. 근데
IPv4의 주소정보를 담기가 불편하다. 이에 동일한 바이트 열을 구성하는 구조
체 sockaddr_in이 정의되었으며, 이를 이용해서 쉽게 IPv4의 주소정보를 담을 수
있다. 대신 bind 할때는 sockaddr 구조체로 처리가 됨.

sockaddr_in

  • sin_family
  • sin_port
  • sin_addr
  • sin_zero

IPv4 주소를 나타내는 데 사용되는 구조, 특히 주소 계열, 포트 번호, IP 주소와 같은 세부정보가 포함된 sockaddr_in 구조에 중점을 둡니다. 구조 내 각 구성원의 목적과 네트워크 바이트 순서의 필요성을 설명합니다.

5. 네트워크 바이트 순서 및 데이터 변환

빅 엔디안

  • 상위 바이트 값을 작은 번지수에 저장
  • 네트워크 바이트 순서의 기준!

리틀 엔디안

  • 상위 바이트의 값을 큰 번지수에 저장

바이트 순서의 변환

  • 빅엔디안으로 변환되었음.

다양한 하드웨어 아키텍처에서 일관된 데이터 전송을 위한 네트워크 바이트 순서(빅 엔디안)의 중요성을 설명합니다. 호스트 바이트 순서를 네트워크 바이트 순서로 변환하기 위해 'htonl()' 및 'htons()'와 같은 바이트 순서 변환 기능을 도입하여 상호 운용성을 보장합니다.

6. 인터넷 주소 초기화 및 할당

'inet_aton' 및 'inet_ntoa'와 같은 함수를 사용하여 문자열 기반 IP 주소를 네트워크 바이트 순서로 또는 그 반대로 변환하는 방법에 대한 통찰력을 제공합니다.

  • 호스트 시스템에서 사용 가능한 모든 인터페이스에 소켓을 바인딩하기 위해 'INADDR_ANY'를 사용하는 것을 포함하여 서버 및 클라이언트 프로그램에 대한 인터넷 주소의 초기화 및 할당을 강조합니다.

inet_aton

-기능상으로 inet_addr 함수와 동일하다.

  • 다만 in_addr형 구조체 변수에 변환의 결과가 저장 된다는 점에서 차이를 보인다.

inet_ntoa

  • inet_aton 함수의 반대기능 제공! 네트워크 바이트 순서로 정렬된 정수형 IP주소정보를 우리가 눈으로 쉽게 인식할 수 있는 문자열의 형태로 변환.

INADDR_ANY

  • 달라진 host IP 주소가 INADDR_ANY 로 들어감.현재 실행중인 컴퓨터의 IP를 소켓에 부여할때 사용됨.

Q. loopback IP 주소로 패킷을 전송할 경우 패킷은 host 안에서 처리된다. 이 과정은 네트워크 어느 계층에서 처리되는가?

  • 패킷은 호스트 내부에서 처리된다. => 네트워크 계층에서 처리.

7. Windows에서 개념 구현

주소 변환을 위해 WSAStringToAddress 및 WSAAddressToString과 같은 Windows 소켓 API 관련 기능을 소개하고 Linux와 Windows 간의 소켓 주소 할당의 유사성을 강조합니다.

  • 윈도우에서도 같은 방법으로 htons, htonl, inet_addr, inet_ntoa 사용가능.
  • 소켓 주소 할당도 리눅스에서의 소켓 주소할당과 차이가 없다.

WSAStringToAddress 코드 사용할 수 있지만, 윈도우 종속적으로 변해.


Connectionless demux: example

  • 소스 IP, 소스 패킷, dest port 를 보고 패킷의 라우팅을 결정함.
  • address: B 는 포트주소 B

제공된 문서에 설명된 비연결 역다중화에 대한 핵심 사항은 UDP(사용자 데이터그램 프로토콜)와 이것이 비연결 방식으로 데이터 전송을 처리하는 방법에 중점을 둡니다. 요약된 내용은 다음과 같습니다.

UDP는 연결이 없습니다: 데이터를 전송하기 전에 발신자와 수신자 사이에 연결을 설정할 필요가 없습니다. 즉, 핸드셰이킹 프로세스가 필요하지 않으므로 연결 설정에 따른 오버헤드가 불필요하거나 해로운 시나리오에서 UDP가 더 간단하고 빨라집니다.

독립적인 세그먼트 처리: 각 UDP 세그먼트는 다른 세그먼트와 독립적으로 처리됩니다. 이는 전송에 고유한 순서나 신뢰성이 없음을 의미합니다. 순서나 신뢰성이 필요한 경우 애플리케이션에 의해 상위 계층에서 구현되어야 합니다.

UDP 사용 시나리오: UDP는 특성상 속도가 중요하고 간헐적인 패킷 손실이 허용되는 애플리케이션에 적합합니다. 여기에는 스트리밍 멀티미디어 애플리케이션(모든 패킷이 도착하는지 확인하는 것보다 스트림을 계속 유지하는 것이 더 중요함), DNS 쿼리(작은 쿼리/응답에 대한 연결 오버헤드가 과도한 경우) 및 SNMP(Simple Network Management Protocol)가 포함됩니다. .

수신기에서의 역다중화: 이 문서에서는 세그먼트를 올바른 애플리케이션 프로세스나 소켓에 전달하기 위해 대상 포트 번호를 사용하여 수신자가 들어오는 패킷을 처리하는 방법을 설명합니다. 여러 애플리케이션이 동일한 호스트의 서로 다른 포트에서 수신 대기할 수 있으므로 이는 UDP 프로토콜에 매우 중요합니다. UDP 헤더의 대상 포트 번호는 세그먼트를 적절한 애플리케이션으로 역다중화하는 데 사용됩니다.

역다중화의 예: 다양한 DatagramSocket에 특정 포트 번호가 할당되는 방식과 대상 포트 번호가 일치하는 수신 패킷이 해당 소켓으로 라우팅되는 방식을 보여주는 예가 제공됩니다.

간단한 헤더 구조: UDP의 단순성은 소스 및 대상 포트 번호, 길이 및 체크섬을 포함하는 세그먼트 헤더에도 반영됩니다. 작은 헤더 크기는 UDP의 오버헤드를 최소화하는 데 기여합니다.

혼잡 제어 또는 흐름 제어 없음: TCP와 달리 UDP는 혼잡 제어 또는 흐름 제어 메커니즘을 구현하지 않습니다. 이는 UDP가 수신자의 데이터 처리 능력이나 발신자와 수신자 간의 네트워크 상태에 대해 걱정하지 않고 애플리케이션이 원하는 만큼 빠르게(또는 네트워크가 처리할 수 있는 만큼 빠르게) 데이터를 보낼 수 있음을 의미합니다.


4주차 -2

listen accept()

우리 코드는 단편적인 예시라 서버 소켓 1 클라이언트 소켓 1 에 accept 한번만 수행해서 이런데, 원래는 클라이언트 소켓이 여러개 될 수 있어. accept 여러개 가능!

server 소켓(listening 소켓) 예시에서 9190포트.

serv_sock = socket(PF_INET, SOCK_STREAM, 0)
  • ex) 5개의 클라이언트가 서버에게 커넥션 요청을 접수하는 용도의 소켓.
  • 외부에서 오는것중 9190 포트로 오는것들
  • 이 서버소켓은 UDP 처럼 포트넘버만 보고 다 듣는. TCP 와 달라.

클라이언트 소켓

clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
  • dst 주소, 소스 포트넘버까지 보고 패킷을 전달한다.
  • 커넥션이 맺어진 후에 생성되는 소켓
  • 외부에 5개가 있으면 소켓이 5개 생성돼.

LEC 09

TCP 서버에 대한 기본 함수 호출

  • TCP 서버에 대한 함수 호출 순서를 설명하고 bind, listen 및 accept 기능의 중요성을 강조합니다. 소켓을 바인딩한 후 서버는 연결을 수락하기 전에 연결을 수신해야 합니다.

"Hello World" 전송을 위한 서버 코드

  • 이 부분에서는 Linux 환경에서 "Hello World"를 전송하기 위한 서버 코드를 소개하며 주소 변환 및 소켓 인터페이스를 위한 특정 헤더 및 데이터 구조의 사용을 강조합니다.

반복 서버 구현

  • 반복 서버가 'accept' 함수를 반복적으로 호출하여 한 번에 하나씩 클라이언트 요청을 처리하지만 여러 클라이언트에 동시에 서비스를 제공할 수 없는 방법에 대해 설명합니다.

TCP 및 UDP 이해

  • TCP/IP 프로토콜 스택의 개요를 제공하고 계층화된 아키텍처를 통해 인터넷 기반 데이터 전송을 용이하게 하기 위한 설계를 설명합니다. 신뢰성과 복잡성 측면에서 TCP와 UDP 프로토콜을 구별합니다.

링크 및 IP 계층 기능

  • LINK 및 IP 계층의 역할을 설명합니다. 전자는 물리적 네트워크 표준과 관련되고 후자는 라우팅 프로토콜과 관련됩니다.

TCP/UDP 레이어

  • 실제 데이터 전송을 담당하는 전송 레이어에 중점을 둡니다. TCP는 신뢰할 수 있어 데이터 전달을 보장하는 반면 UDP는 이를 보장하지 않습니다.

애플리케이션 계층

  • 소켓을 생성하면 링크, IP 등이 감춰진다. => 추상화
    => 응용프로그램은 APPLICATION 계층 완성에 집중!

TCP 기반 서버 및 클라이언트 구현 (3가지 함수 중요)

  • 데이터 송수신은 카피본 소켓이, 연결은 본 소켓이.

  • 연결 요청하면 서버 소켓은 응답하지만, 아직 연결된게 아님!

listen()

  • 연결을 수락할 소켓을 준비
  • 외부에 있는 함수들은 언제든지 요청가능

accept()

  • 실제로 들어오는 연결을 수락하여 통신을 위한 새 소켓을 만듭니다.

  • 바인드 함수가 끝나면, 포트넘버, IP 가 할당

  1. 서버코드에서 accept() 수행하면 연결 요청 대기큐에서 하나의 연결요청을 선택.
  2. 해당 클라이언트와의 데이터 통신을 전담할 소켓(서버코드 내 client 소켓)
    을 생성.
  3. 해당 클라이언트 소켓과의 연결 완료.

connect()

  • 서버의 청취 소켓에 대한 연결을 요청하는 클라이언트측 작업

  • 서버에서 listen() 이 정상적으로 수행되면 외부에서 언제든지 connect() 가능.

  • 클라이언트에 의해 connect() 함수가 호출되면 => IP ,Port 주소가 할당됨.

  1. 서버에 의해 연결요청이 접수됨. 2. 네

반복 에코 서버 및 클라이언트

  • 서버가 클라이언트가 보낸 메시지를 다시 에코하는 반복 에코 서버 및 클라이언트의 작동을 설명합니다.
  • 클라이언트에 순차적으로 서비스를 제공하는 서버의 제한 사항에 대해 설명합니다.

에코 클라이언트의 문제점! read & write


  • UDP와 달리 TCP 는 이게 쪼개져서 갈 수 있어. 그래서 받는 쪽에서 read 할때 한번에 못받는 경우가 있어.
  • 이렇게 바뀌어야해.

Windows 구현 고려 사항

차이점들

소켓을 이용하여 통신이 연결되는 개략적인 과정

dst IP,

getsockname()

getpername()

서버 및 클라이언트 소켓 식별: 연결 설정 초기 단계에서 서버 소켓(또는 청취 소켓)과 클라이언트 소켓을 구별합니다. 서버 소켓은 들어오는 연결을 수신하고 클라이언트 소켓은 연결 요청을 시작합니다.

수락 시 클라이언트 소켓 생성: 서버가 accept() 함수를 실행할 때 연결 클라이언트와의 통신을 관리하기 위한 새로운 클라이언트 소켓을 생성합니다. 이 프로세스는 연결 요청 수신에서 클라이언트와의 적극적 통신으로 전환하는 데 중요합니다.

클라이언트 소켓에 IP 및 포트 자동 할당: 문서에서는 서버 소켓이 socket() 및 bind() 호출을 통해 명시적으로 IP 및 포트에 바인딩되지만 클라이언트 소켓은 connect()를 호출하면 운영체제에 의해 IP 주소와 포트 번호가 자동으로 할당됩니다. 이 할당은 클라이언트 코드에서 명시적인 bind() 호출 없이 수행되므로 클라이언트측 설정이 단순화됩니다.

연결 설정 프로세스: 소켓을 사용하여 연결을 설정하는 단계를 간략하게 설명합니다.

서버는 서버 소켓을 생성하고 연결을 수신하도록 하여 들어오는 연결을 준비합니다.
클라이언트는 클라이언트 소켓을 생성하고 connect()를 호출하여 서버 주소를 지정하여 연결을 시작합니다.
connect() 호출이 성공하면 서버의 accept() 함수는 통신을 위해 새로 설정된 연결 전용으로 새로운 클라이언트 소켓을 생성합니다.

외부 리소스 참조: 이 문서는 소켓 프로그래밍과 네트워크 연결 설정과 관련된 핸드셰이크 프로세스를 자세히 설명하는 외부 리소스에 대한 링크를 제공합니다.

0개의 댓글

관련 채용 정보