📦

[Network] TCP 통신 소스코드 예제 | C언어

Table of contents
TCP 통신을 하는 소스코드 예제 ! TLS 통신을 하기 위해선 TCP 통신을 먼저 구현해봐야 할 것 같아서 먼저 작성해보았다.

TCP Transmission Control Protocol

신뢰성 있는 데이터 전송을 제공하는 프로토콜
연결 지향적(Connection-oriented)
TCP 주요 특징
1.
신뢰성 보장 → 패킷 손실 시 재전송 (ACK & Retransmission)
2.
순서 보장 → 패킷이 전송된 순서대로 수신 (Sequencing)
3.
흐름 제어 → 송신과 수신 속도를 조절하여 과부하 방지 (Window Size 조절)
4.
오류 검출 → Checksum을 이용하여 데이터 무결성을 확인

TCP Server - Client 함수 흐름

일반적으로 아래의 함수 호출 순서를 따름
Server
socket() - Socket 생성
bind() - 특정 IP와 Port에 Socket Binding
listen() - Client 연결 요청을 대기
accept() - Client 연결 수락 & 새로운 Socket 반환
recv() - Client로 부터 Data 수신
send() - Client에게 Data 송신
close() - Socket을 닫고 연결 종료
Client
socket() - Socket 생성
connect() - Server에 연결 요청
send() - Server에 Data 송신
recv() - Server로 부터 Data 수신
close() - Socket을 닫고 연결 종료

3-Way Handshake

1.
Client → Server (SYN) → Client가 Server에 연결 요청 ( SYN Packet 전송 )
2.
Server → Client (SYN-ACK) → Server가 요청을 승인하고 응답 ( SYN + ACK Packet 전송 )
3.
Client → Server (ACK) → Client가 최종 확인 후 연결 완료 ( ACK Packet 전송 )

4-Way Handshake

1.
Client → Server (FIN) → Client가 Server에 연결 종료 요청 ( FIN Packet 전송 )
2.
Server → Client (ACK) → Server가 종료 요청을 승인 ( ACK Packet 전송 )
3.
Server → Client (FIN) → Server도 종료 요청 ( FIN Packet 전송 )
4.
Client → Server (ACK) → Client가 최종 확인 ( ACK Packet 전송 후 연결 종료 )

TCP - Source Code

테스트 환경 참고
Ubuntu 22.04.3 LTS
Linux DESKTOP-711RRPG 5.15.167.4-microsoft-standard-WSL2 #1 SMP Tue Nov 5 00:21:55 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
예제코드는 리눅스 기반으로 작성
1.
내 PC 8080 포트를 사용하여 server를 띄워두고
2.
client로 server(127.0.0.1:8080)에 message를 하나 보내고
3.
server도 client로 message를 하나 보내고,
4.
client는 종료, server는 listen상태로 대기 !
tcp_server.c
tcp_client.c
Makefile
위 코드를 그대로 저장 후 make tcp 명령으로 컴파일하면, 테스트 해볼 수 있다
TCP 통신코드 작성 시, recv()&send() vs read()&write() 비교

TCP - Test

./tcp_server 를 실행하면 아래와 같이 listen 상태로 대기한다.
./tcp_client 를 실행하면, 서버에 메시지를 하나 보내고, tcp_client는 바로 종료된다.
client가 server에 보낸 메시지가, listen으로 대기중이던 server측 화면에 출력된다.
서버는 직접 종료하기 전까지 계속 메시지를 받을 수 있도록 대기중이다. 종료를 원할 경우 서버측 화면에서 [ Ctrl+c ] 를 눌러서 종료시킬 수 있다.

TCP Packet trace !

다음 글에서는 TLS 통신 코드를 작성할건데, 왜 TLS를 사용해야 하는지 tcpdump를 사용하여 확인해보려 한다.
TLS(Transport Layer Security)는 보안을 제공하는 프로토콜로, TCP와 같은 전송 계층 프로토콜 위에서 작동하며, 데이터의 기밀성, 무결성, 인증을 제공한다.
tcpdump를 사용하여 내가 지정한 Interface나 Port를 지나가는 Packet들을 확인 할 수 있다.
아래 이미지를 보면, Client Server 서로 어떤 Data를 보냈는지 중간 Packet에서 확인이 가능하다..
TLS통신을 사용하게 되면 Data의 내용을 암호화하여 송/수신하여 Packet을 캡쳐해도 어떤 내용인지 확인 할 수 없다.
영상으로 남겨두기