1. Echo 클라이언트의 완벽한 구현 (05-1장)
Echo 클라이언트 관련 문제
- TCP에는 본질적으로 데이터 경계 정의가 없기 때문에 Echo 클라이언트는 데이터 경계를 기술해야 합니다. 이로 인해 데이터 경계를 구분하지 못하는 TCP의 기존 읽기 및 쓰기 기능에 문제가 발생합니다.
해결책
- 쓰기 함수 호출로 전송된 정확한 양의 데이터를 읽는 루프를 구현하십시오. 이는 TCP 기반 통신에서 데이터를 올바르게 분리하기 위한 추가 요구 사항입니다.
2. Echo 클라이언트 및 서버의 향상된 기능
에코 클라이언트(echo_client2)
![](https://velog.velcdn.com/images/mpfo0106/post/2f071d09-7b48-4ddb-bc51-636d95dfed64/image.png)
개행 문자가 나타날 때까지 문자열을 읽습니다. 이는 완전한 문장을 읽는다는 의미입니다. 그러나 한 번에 전체 문장을 읽지 못할 수 있으므로 반복 시도를 위해 while 루프가 필요합니다.
에코 서버
![](https://velog.velcdn.com/images/mpfo0106/post/557782c8-c879-4835-96b2-ebfe25a25e4e/image.png)
클라이언트로부터 문장 단위의 데이터를 수신함에도 불구하고, 서버가 데이터를 조각조각 나누어 읽을 수 있습니다. 연속 작업을 위해 while 루프를 사용하여 읽는 대로 데이터를 다시 보냅니다.
3. 계산기 프로그램 구현(응용 프로토콜)
기능
- 서버는 클라이언트로부터 여러 숫자와 연산자를 수신하고 요청된 연산(덧셈, 뺄셈, 곱셈)을 수행하고 결과를 다시 보냅니다. 이 데이터 교환의 사양은 프로토콜을 정의합니다.
![](https://velog.velcdn.com/images/mpfo0106/post/ddf4bd0d-8874-4079-a1c2-a1c474a00a22/image.png)
실행
- 예: 클라이언트-서버 통신이 데이터 전송 및 작업 실행을 위해 정의된 프로토콜을 따르는 방법을 보여줍니다.
4. TCP의 이론적 측면(05-2장)
TCP 소켓의 입력/출력 버퍼
- 각 TCP 소켓에는 소켓 초기화 시 생성되는 자체 I/O 버퍼가 있습니다. 이러한 버퍼는 슬라이딩 윈도우 프로토콜 적용으로 인해 데이터 오버플로 상황이 발생하지 않도록 합니다.
슬라이딩 윈도우 프로토콜 및 데이터 전송 유형
- TCP가 데이터 흐름 및 정체 제어를 관리하여 소켓 간의 안정적인 데이터 전송을 촉진하는 방법을 보여줍니다.
5. TCP의 내부 작동 원리
연결 설정(3-Way Handshake)
- 소켓 간의 연결을 설정하고, 패킷에 시퀀스 번호를 할당하고, 안정적인 통신을 보장하는 프로세스를 간략하게 설명합니다.
데이터 전송
![](https://velog.velcdn.com/images/mpfo0106/post/764fa010-2b15-445f-a6c8-43e3fcab0bdb/image.png)
- ACK 는 다음에 내가 받고싶은것. seq+ 전송된 바이트 크기 +1
- 손실된 데이터에 대한 재전송 전략과 함께 데이터 전송 및 무결성을 확인하기 위해 ACK 값을 증가시키는 것의 중요성을 설명합니다.
연결 종료(4-Way Handshake)
![](https://velog.velcdn.com/images/mpfo0106/post/45a881a1-9064-44d3-9710-31786d37aa78/image.png)
- 데이터 손실은 주로 아직 전송 중이거나 네트워킹 스택의 버퍼에 있는 데이터의 잠재적인 손실
- 갑작스러운 종료로 인한 데이터 손실을 방지하고 연결을 안전하게 종료하는 4단계 프로세스를 설명합니다.
6. Windows에서의 구현
Windows 기반 구현
- 제공된 예제, 즉 'op_server.c' 및 'op_client.c'는 추가 세부 지침 없이 Windows 플랫폼에 맞게 조정되었음을 언급합니다.
- 이 문서는 이론적 지식과 실제 응용 사례에 초점을 맞춘 고급 TCP/IP 소켓 프로그래밍 기술에 대한 5장의 논의가 끝났음을 나타내는 질문으로 마무리됩니다.
UDP 에 대한 이해(06-1장)
UDP 소켓의 특성 및 작동 원리
- TCP와 달리 UDP는 메시지 전달을 위해 SEQ 및 ACK를 활용하지 않으며(흐름 제어 부족) 연결 설정 및 종료를 요구하지 않습니다. 이로 인해 데이터가 손실될 수 있지만 더 빠른 데이터 전송이 가능합니다. 안정성보다 성능이 우선시되는 경우에는 UDP가 선호됩니다.
2. UDP 기반 서버/클라이언트 구현하기(06-2장)
UDP 데이터 전송
- UDP는 1대1 연결에 대한 TCP의 요구 사항과 달리 연결 개념을 포함하지 않습니다. 이러한 부재로 인해 별도의 서버 및 클라이언트 소켓이 필요 없이 단일 소켓을 사용하여 여러 도메인에 걸쳐 데이터를 전송할 수 있습니다.
3. UDP의 데이터 입출력 기능
데이터 송수신
![](https://velog.velcdn.com/images/mpfo0106/post/8d3e2300-c2aa-4479-b8ea-2bd41a42befb/image.png)
Q. UDP에서는 데이터의 경계가 존재하므로 5초간의 delay를 삽입해도 총 3개의 메시지를 3번의 recvfrom 함수 호출을 통해서 수신한다.만일 TCP 통신이었더라도(recvfrom은 recv로, sendto는 send로 대체) 3번 수신했을까요 ??
UDP
- UDP 패킷은 수신자의 recvfrom() 함수에 대한 정확히 한 번의 호출에 해당합니다. 발신자가 3개의 메시지를 보내는 경우 수신자는 메시지 전송 사이의 지연에 관계없이 해당 메시지를 수신하기 위해 3개의 'recvfrom()' 호출이 필요합니다.
TCP
#4. UDP 기반 에코 서버 및 클라이언트
UDP 에코 서버
- 발신자 정보를 참조하여 데이터 에코에 주의하세요.
UDP 에코 클라이언트
- UDP에 데이터 경계가 있으므로 recvfrom에 대한 단일 호출로 전체 메시지를 읽을 수 있으며 일반적으로 주소 할당 프로세스가 불필요하므로 클라이언트 측 프로그래밍이 단순화됩니다.
클라이언트 쪽 UDP 경우 OS 가 sendto 함수호출 시 클라이언트의 IP와 PORT번호가 자동으로 할당해준다. => 주소 할당 필요 X
5. UDP의 데이터 전송 특성과 connect 기능(06-3장)
- 기존 TCP 에서는 서버와 클라이언트가 진짜 connection 을 맺었음.
근데 UDP 에서 connection 함수는 IP, 포트번호만 연결하는 기능만 수행함!
UDP의 데이터 경계
-
송신측에서 sendto()가 세 번 호출되면 수신측에서는 그에 따라 recvfrom()을 세 번 호출해야 하며 이는 UDP의 데이터 경계 보존을 보여줍니다.
-
TCP 의 경우에는 한번만 recv해도 돼. TCP의 설계는 데이터 경계 보존보다 데이터 무결성, 순서 및 신뢰성을 우선시합니다. 흐름 제어, 오류 감지 및 수정과 같은 메커니즘이 결합된 스트림 지향 접근 방식은 웹 탐색이나 파일 전송과 같이 안정적인 통신이 필요한 애플리케이션에 적합합니다.
connected vs. unconnected UDP 소켓
- 연결된 UDP 소켓은 TCP 의미의 연결을 의미하지 않지만 대상 정보를 등록하여 데이터 전송을 위한 읽기 및 쓰기 기능을 사용할 수 있습니다.
6. UDP의 멀티캐스트 및 브로드캐스트 통신
UDP 사용할 경우 multicast 통신 (출발지 1개, 목적지는 여러 개) 및 broadcast 통신 (출발지 1개, 목적지는 전부(예:subnet 전체)) 가능.
멀티캐스트
-
동시에 여러 대상(멀티캐스트 그룹)으로 데이터를 보낼 수 있으므로 각 호스트에 개별적으로 TCP 또는 UDP를 전송하는 것보다 적은 트래픽이 필요합니다.
-
연결의 개념이 존재하지 않는다. 따라서 UDP 소켓을 기반으로 전송
-
멀티캐스트 그룹을 대상으로 하는 데이터의 수신을 위해서는 가입의 절차를 걸쳐야 한다. =>
라우팅과 TTL
- 패킷을 얼마나 멀리 보낼것인가를 결정
- TTL은 정수로 표현되며, 라우터를 하나 거칠 때마다 1씩 감소.
그룹으로의 가입방법
![](https://velog.velcdn.com/images/mpfo0106/post/1bad54ae-131e-45e1-a8af-dbad3181249e/image.png)
- 멀티캐스트 IP 주소 세팅.
- 멀티캐스트 그룹의 가입은 소켓의 옵션정보 변경을 통해서 이뤄진다.
그룹의 가입에 사용되는 프로토콜 레벨은 IPPROTO_IP이고, 프로토콜의 이름은 IP_ADD_MEMBERSHIP이다.
그리고 그룹의 정보는 ip_mreq 구조체 변수를 이용해서 표현한다.
![](https://velog.velcdn.com/images/mpfo0106/post/22c1c51a-1983-46f2-ba99-831a3bafe877/image.png)
- 이 데이터는 라이오 방송과 마찬가지로 receiver가 그룹에 가입을 하는순간부터 수신을 시작한다.
![](https://velog.velcdn.com/images/mpfo0106/post/c93b6e49-1b7f-4817-87cb-fa86de910b8c/image.png)
- receiver가 멀티캐스트 그룹에 가입을하는 순간부터 데이터를 수신하게 된다.
따라서 가입 이전에 sender가 전 한 데이터는 수신할 수 없다.
브로드캐스트
- UDP 소켓을 활용하여 direct 모드(외부 서브넷의 경우)
- 로컬 모드(동일한 네트워크 내)에서 서브넷의 모든 호스트에 데이터를 보낼 수 있습니다.
브로드 캐스트 Sender
- 255.255.255.255 가 브로드 캐스트 주소. 9190 이 포트주소
7. Windows에서의 구현
Windows 기반 sendto 및 recvfrom 함수
- 이 함수는 Linux 대응 기능과 유사하게 작동하며 큰 차이점은 없습니다.
Windows의 connected UDP 소켓
- 연결된 UDP 소켓의 생성 및 데이터 전송/수신 프로세스는 Linux와 동일하므로 원활한 크로스 플랫폼 UDP 프로그래밍이 가능합니다.
이 문서는 질문을 유도하고 UDP 기반 서버 및 클라이언트 구현에 대한 강의를 마무리하며 데이터 신뢰성보다 속도와 효율성이 더 중요한 특정 애플리케이션 요구 사항에 UDP를 사용하는 이점을 강조하면서 마무리됩니다.
실습
- client 를 server보다 먼저 수행하면 오류가 나오는데 왜그럴까??
- 현재 iterative echo server 는 다른 서비스가 종료될 때까지 한개밖에 안되는데,
과제 2
- 클라이언트 쪽에서 파일 오픈한다음에 패킷형태로 서버로 보내고, 서버에서는 이걸 받아서 오픈하고 패킷을 그 파일로 저장하는.