Lec 07
소켓 프로그래밍에 필요한 기초 지식을 강조하면서 socket() 함수와 그 인수를 소개합니다.
데이터 구조 정의와 함께 주소 변환 및 소켓 인터페이스를 위한 헤더 파일을 포함하여 Linux 환경에서 서버 코드를 사용하여 "Hello World" 메시지를 보내는 방법을 보여줍니다.
Linux 설정에서 "Hello World" 메시지를 수신하기 위한 클라이언트 측 코드를 제공합니다.
프로토콜의 이해, 소켓 생성 시 기본 프로토콜 지정의 필요성, 도메인, 유형, 프로토콜과 같은 매개변수가 프로토콜 정보와 어떻게 관련되는지에 대해 논의합니다.
소켓 프로그래밍 학습을 위한 기반으로 IPv4 인터넷 프로토콜 시스템(PF_INET)에 초점을 맞춘 프로토콜 제품군에 대한 설명입니다.
연결 지향 및 비연결 소켓 유형을 포함한 소켓 유형 및 데이터 전송 방법에 대한 설명입니다.
TCP(연결 지향) 소켓과 UDP(연결 없는) 소켓을 자세히 비교하여 데이터 전송 특성, 신뢰성, 순서, 경계 및 연결 구조를 강조합니다.
IPv4 인터넷 프로토콜 시스템에서 소켓 생성을 위한 프로토콜 선택에 대한 설명, TCP와 UDP 소켓을 구별하고 프로토콜이 본질적으로 처음 두 인수에 의해 결정되는 경우 세 번째 인수는 0이 될 수 있다는 점에 유의합니다.
데이터 전송(tcp_server.c) 및 수신(tcp_client.c)을 위한 코드 조각을 포함하여 TCP 소켓 전송에서 데이터 경계가 없음을 보여주는 실제 예입니다.
앞에서 언급한 개념과 예를 Windows 운영 체제에 적용하여 프로토콜 표준과 소켓 유형 특성이 다양한 OS 플랫폼에서 일관되게 유지된다는 점을 강조합니다.
Lec08
이 장은 소켓 내에서 주소가 표현되는 방식, 인터넷 주소 초기화의 중요성에 대한 소개로 시작하여 소켓을 특정 로컬 IP 주소 및 포트와 연결하는 데 중요한 bind() 함수에 대해 논의합니다. 숫자.
인터넷 주소에 대해 자세히 설명하고 네트워크에서 컴퓨터를 고유하게 식별하는 목적을 설명하며 4바이트 IPv4 시스템과 16바이트 IPv6 시스템을 구별합니다. 또한 인터넷 주소를 네트워크 주소와 호스트 주소로 구분하여 네트워크 식별 및 호스트 구별을 돕는 방법에 대해 설명합니다.
=> sockaddr은 다양한 주소체계의 주소정보를 담을 수 있도록 먼저 정의되었다. 근데
IPv4의 주소정보를 담기가 불편하다. 이에 동일한 바이트 열을 구성하는 구조
체 sockaddr_in이 정의되었으며, 이를 이용해서 쉽게 IPv4의 주소정보를 담을 수
있다. 대신 bind 할때는 sockaddr 구조체로 처리가 됨.
IPv4 주소를 나타내는 데 사용되는 구조, 특히 주소 계열, 포트 번호, IP 주소와 같은 세부정보가 포함된 sockaddr_in 구조에 중점을 둡니다. 구조 내 각 구성원의 목적과 네트워크 바이트 순서의 필요성을 설명합니다.
다양한 하드웨어 아키텍처에서 일관된 데이터 전송을 위한 네트워크 바이트 순서(빅 엔디안)의 중요성을 설명합니다. 호스트 바이트 순서를 네트워크 바이트 순서로 변환하기 위해 'htonl()' 및 'htons()'와 같은 바이트 순서 변환 기능을 도입하여 상호 운용성을 보장합니다.
'inet_aton' 및 'inet_ntoa'와 같은 함수를 사용하여 문자열 기반 IP 주소를 네트워크 바이트 순서로 또는 그 반대로 변환하는 방법에 대한 통찰력을 제공합니다.
-기능상으로 inet_addr 함수와 동일하다.
주소 변환을 위해 WSAStringToAddress 및 WSAAddressToString과 같은 Windows 소켓 API 관련 기능을 소개하고 Linux와 Windows 간의 소켓 주소 할당의 유사성을 강조합니다.
WSAStringToAddress 코드 사용할 수 있지만, 윈도우 종속적으로 변해.
Connectionless demux: example
제공된 문서에 설명된 비연결 역다중화에 대한 핵심 사항은 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 여러개 가능!
serv_sock = socket(PF_INET, SOCK_STREAM, 0)
clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
LEC 09
데이터 송수신은 카피본 소켓이, 연결은 본 소켓이.
연결 요청하면 서버 소켓은 응답하지만, 아직 연결된게 아님!
실제로 들어오는 연결을 수락하여 통신을 위한 새 소켓을 만듭니다.
바인드 함수가 끝나면, 포트넘버, IP 가 할당
서버의 청취 소켓에 대한 연결을 요청하는 클라이언트측 작업
서버에서 listen() 이 정상적으로 수행되면 외부에서 언제든지 connect() 가능.
클라이언트에 의해 connect() 함수가 호출되면 => IP ,Port 주소가 할당됨.
서버 및 클라이언트 소켓 식별: 연결 설정 초기 단계에서 서버 소켓(또는 청취 소켓)과 클라이언트 소켓을 구별합니다. 서버 소켓은 들어오는 연결을 수신하고 클라이언트 소켓은 연결 요청을 시작합니다.
수락 시 클라이언트 소켓 생성: 서버가 accept() 함수를 실행할 때 연결 클라이언트와의 통신을 관리하기 위한 새로운 클라이언트 소켓을 생성합니다. 이 프로세스는 연결 요청 수신에서 클라이언트와의 적극적 통신으로 전환하는 데 중요합니다.
클라이언트 소켓에 IP 및 포트 자동 할당: 문서에서는 서버 소켓이 socket() 및 bind() 호출을 통해 명시적으로 IP 및 포트에 바인딩되지만 클라이언트 소켓은 connect()를 호출하면 운영체제에 의해 IP 주소와 포트 번호가 자동으로 할당됩니다. 이 할당은 클라이언트 코드에서 명시적인 bind() 호출 없이 수행되므로 클라이언트측 설정이 단순화됩니다.
연결 설정 프로세스: 소켓을 사용하여 연결을 설정하는 단계를 간략하게 설명합니다.
서버는 서버 소켓을 생성하고 연결을 수신하도록 하여 들어오는 연결을 준비합니다.
클라이언트는 클라이언트 소켓을 생성하고 connect()를 호출하여 서버 주소를 지정하여 연결을 시작합니다.
connect() 호출이 성공하면 서버의 accept() 함수는 통신을 위해 새로 설정된 연결 전용으로 새로운 클라이언트 소켓을 생성합니다.
외부 리소스 참조: 이 문서는 소켓 프로그래밍과 네트워크 연결 설정과 관련된 핸드셰이크 프로세스를 자세히 설명하는 외부 리소스에 대한 링크를 제공합니다.