TCP 프로토콜
TCP(Transmission Control Protocol)는 데이터를 반드시 전달하는 신뢰성을 보장한다. 이를 위해 내부적으로 다음과 같은 복잡한 일을 수행한다.
-
흐름 제어: 상대방이 받을 수 있는 만큼만 데이터를 송신한다.
-
오류 제어: 데이터가 손실되면 다시 송신한다.
-
순서 보장: 패킷 순서와 관계 없이 송신할 경우 수신 측에서 이를 조립한다.
주소 시스템 정밀 조작
컴퓨터에는 여러 개의 IP가 있을 수 있고, 수만 개의 포트가 있다. 이를 C# 언어에서 정밀하게 지정해야 한다.
-
IPAddress.Any: 서버를 만들 때 가장 많이 사용한다. 내 컴퓨터에 들어오는 모든 IP 주소로부터의 연결을 다 허용하겠다는 의미이다.
-
IPAddress.Loopback: 내 컴퓨터 안에서만 통신할 때 사용하며, 외부망이 차단되어도 작동한다.
-
IPEndPoint: 주소와 포트의 결합이다.
TCPListener
TCPListener는 스스로 데이터를 주고 받는 존재가 아니라, 연결을 기다리는 서버의 역할을 한다.
-
객체 생성 및 Bind: TCPListener(IPEndPoint)를 통해 특정 포트를 선점한다. 이 포트가 이미 다른 프로그램에 의해 사용 중이면 SocketException 예외가 발생한다.
-
Start or Listen: 운영체제에게 이제부터 이 포트로 들어오는 신호를 나에게 넘겨달라고 요청한다. 이때 운영체제는 백로그(Backlog)라는 대기 공간을 만들어 연결 요청을 순서대로 쌓아둔다.
-
Accept: 서버가 대기열에서 클라이언트를 하나 꺼내어 안으로 들여보낸다.
- AcceptTCPClient() 메소드: 이 메소드가 실행되면 프로그램은 클라이언트가 접속할 때까지 블로킹 상태가 되며, 성공 시 TCPClient 객체가 반환된다. 이제붵는 이 객체를 통해 패킷 교환이 시작된다.
TCPClient
TCPClient는 서버가 열어 놓은 문으로 패킷 교환을 시도하는 존재이다.
-
Connect: client.Connect() 메소드를 호출하면 운영체제는 서버와의 연결을 시도한다.
-
3-Way Handshake: 코드는 한줄이지만, 배경에서는 운영체제가 서버와 다음과 같은 제어 패킷을 주고 받는다. 다음 과정이 끝나야만 비로소 Connect() 메소드가 성공으로 반환된다.
-
1단계 SYN: 클라이언트 -> 서버
-
2단계 SYN-ACK: 서버 -> 클라이언트
-
3단계 ACK: 클라이언트 -> 서버
-
흐르는 패킷
흐르는 패킷(Conceptual Packet) 또는 실제 네트워크를 이용하는 패킷은 다음과 같은 구조를 가진다.
| 계층 | 구성 요소 | 설명 |
|---|---|---|
| Ethernet Header | MAC 주소 | 물리적인 랜카드 주소 정보 |
| IP Header | 출발 및 도착 IP | 컴퓨터 위치 확인 |
| TCP Header | 출발 및 도착 포트, 순서 번호 | 프로그램 위치 및 데이터 순서 확인 |
| PayLoad | 데이터 | 실제로 보낸 데이터 내용 |
- MTU(Maximum Transmission Unit): 보통 한 번에 보낼 수 있는 패킷의 최대 크기는 약 1,500 바이트로, TCP는 이를 수천 개의 패킷으로 분할하여 재포장한다.