Table of contents
TCP 통신을 하는 소스코드 예제 !
TLS 통신을 하기 위해선 TCP 통신을 먼저 구현해봐야 할 것 같아서 먼저 작성해보았다.
TCP
Transmission Control Protocol
•
신뢰성 있는 데이터 전송을 제공하는 프로토콜
•
연결 지향적(Connection-oriented)
•
TCP 주요 특징
1.
신뢰성 보장 → 패킷 손실 시 재전송 (ACK & Retransmission)
2.
순서 보장 → 패킷이 전송된 순서대로 수신 (Sequencing)
3.
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을 캡쳐해도 어떤 내용인지 확인 할 수 없다.
영상으로 남겨두기