1. 오늘 한 것
① 네트워크 프로토콜 이해: TCP vs UDP
- TCP (Transmission Control Protocol)
- 특징 : 정보가 한 번이라도 누락되면 안 되는 높은 신뢰성이 필요할 때 사용. 상대방의 IP가 연결되어 있어야 함.
- 사용처 : 은행 프로그램, 카카오톡 등 데이터의 정확성이 생명인 곳.
- UDP (User Datagram Protocol):
- 특징: 신뢰도는 다소 낮지만, 패킷에 순서나 연결 상태를 묻지 않아 속도가 매우 빠름. 여러 명에게 동시에 뿌리는 브로드캐스트(Broadcast) 기능이 있음.
- 사용처: 약간의 끊김이나 데이터 손실이 있어도 실시간성이 중요한 영상 스트리밍 등.
② 데이터 송수신 개념: Packing & Unpacking
- 패킹 (Packing / 직렬화): 구조체 같은 덩어리 데이터를 네트워크로 전송하기 위해 일렬로 줄을 세워 '짐을 싸는' 과정.
- 언패킹 (Unpacking / 파싱): 수신받은 데이터를 다시 의미 있는 데이터(종류별)로 나누어 '짐을 푸는' 과정.
③ 네트워크 구조: IP 주소와 포트(Port)
- IP 주소: 통신을 위한 '집 주소' (여러 대가 공유 및 사용 가능).
- 포트(Port): 그 집 안의 '방 호수'. 프로세스와 1:1로 매칭됨.
- 주의점: 포트는 한 번 열었으면 반드시 잘 닫아주어야(Close) 충돌이나 시스템 에러를 방지할 수 있음.
④ 바이트 오더(Byte Order)와 정렬 함수
- 엔디안(Endian) 차이: 데이터를 메모리에 저장하는 순서.
→ 리눅스/윈도우 PC(호스트)는 보통 '리틀 엔디안'을 쓰지만, 네트워크 세상은 '빅 엔디안'을 표준으로 사용함.
- hton (Host to Network): 내 PC(호스트)에서 밖(네트워크)으로 나가는 데이터 변환. (리틀 엔디안 → 빅 엔디안)
- ntoh (Network to Host): 밖(네트워크)에서 내 PC(호스트)로 들어오는 데이터 변환. (빅 엔디안 → 리틀 엔디안)
⑤ C언어/리눅스 실무 팁 및 기타 OS 개념
- 명시적 자료형 사용: unsigned int 대신 크기가 명확한 uint16_t, uint32_t를 사용하여 플랫폼 간 호환성 확보.
- 메모리 함수: memset, memcpy를 적절히 활용해 데이터 초기화와 복사를 깔끔하게 처리.
- 우분투 고정 IP 할당: sudo ifconfig enp0s3 192.168.0.105 up 명령어로 임시 고정 IP 할당 실습.
- FTP (File Transfer Protocol): 우분투 환경에서 파일을 빠르고 쉽게 업로드/다운로드하며 공유하는 방법 확인.
- RTOS (Real-Time OS): 지정된, 예상된 시간 안에 작업을 '반드시' 끝내주는 실시간 운영체제의 특징 이해.
2. 문제 / 헷갈린 점
① 통신 보안에 대한 막막함 (공개키 알고리즘 등):
- 강사님께서 통신 시 '공개키 알고리즘' 등을 사용하여 암호화해 보내는 등 보안에도 신경을 써보라고 하셨는데, 네트워크 개념 자체도 벅찬 상황이라 이 부분이 아주 생소하게 느껴졌다.
- 보충 정리: 찾아보니 우리가 흔히 쓰는 TCP/UDP로 데이터를 그냥 보내면(평문 전송), 중간에 누군가 패킷을 가로채서(스니핑) 그 내용을 다 들여다볼 수 있다고 한다. '공개키 암호화(RSA 등)'는 데이터를 '잠그는 키(공개키)'와 '여는 키(개인키)'를 다르게 만들어서, 중간에 탈취당해도 암호를 풀 수 없게 만드는 훌륭한 방어막 역할을 한다. 당장 직접 C언어로 복잡한 암호화 알고리즘을 다 짜기는 어렵겠지만, 추후 소켓 통신 프로그램이 안정화되면 OpenSSL 같은 보안 라이브러리를 붙여서 센서 데이터를 안전하게 전송하는 방안을 꼭 고민해 봐야겠다.
② hton, ntoh 방향성 헷갈림
- 처음에 나가는 건지 들어오는 건지 헷갈렸는데, 단어 그대로 h(Host) to n(Network)은 내 방에서 밖으로 나가는 거니까 리틀->빅으로 바꾸는 거라고 이해하니 명확해짐.
③ 포트와 IP 변환 시 자료형 크기 오류 바로잡기:
* 수업을 들으며 메모할 때 크기를 잘못 적었는데 다시 찾아보니,
- htons의 **'s'**는 short 타입으로 16비트(2바이트). 주로 포트 번호 변환에 씀.
- htonl의 **'l'**은 long 타입으로 32비트(4바이트). 주로 IP 주소 변환에 씀.
3. 오늘 배운 핵심
- 네트워크 데이터 전송 시 바이트 오더(Endian) 변환은 선택이 아닌 필수다. (hton, ntoh 함수 사용)
- 네트워크 통신은 단순히 데이터를 보내는 것을 넘어 '암호화(보안)'까지 고려해야 완벽해진다.
- memset, memcpy 같은 메모리 제어 함수와 명시적 자료형(uint32_t 등)을 습관화하여 예측 가능한 안정적인 코드를 짜자.
'포트폴리오 > [IoT 기반 피지컬 AI 교육일지]' 카테고리의 다른 글
| [ C++ 네트워크 통신 ] 리눅스 멀티스레드(pthread)와 주요 소켓 옵션 및 기타 정리 (23일차 기록) (0) | 2026.03.20 |
|---|---|
| [ C++ 멀티스레드 TCP 서버 ] 데이터 구조화 및 스레드 동기화 (22일차 기록) (0) | 2026.03.11 |
| [ C언어 IoT 프로젝트 개발 ] #3 프로젝트 발표 및 시연 (20일차 기록) (0) | 2026.03.10 |
| [ C언어 IoT 프로젝트 개발 ] #2 멀티스레드 적용 및 위험 자동 감지 (19일차 기록) (0) | 2026.03.10 |
| [ C언어 IoT 프로젝트 개발 ] #1 센서 데이터 수집 및 UART 통신 (18일차 기록) (0) | 2026.03.10 |