앞에서 구현한 TCP 서버/ 클라이언트는 프로그래밍 관점에서만 공부한 것이다. 이는 TCP의 동작 방식을 고려 하지 않았는데 이번장을 통해 TCP의 이론적인 부분을 이해한다.
-에코 클라이언트의 완벽 구현-
왼쪽 echo_client.c를 보면 45~46의 코드를 보면 "read, write 함수가 호출될 때마다 문자열 단위로 실제 입출력이 이뤄진다"는 잘못된 가정이 있는 것을 알수 있다. 그러나 TCP는 연결 지향형으로 전송 데이터의 경계가 없다. 그렇기 때문에 한 데이터를 서버가 두 패킷에 나눠 보낼수도 있고 여러 문자열이 한 패킷에 올 수도 있다. 이 문제를 아래 echo_client2.c 에서 보듯이 write로 전송한 문자열의 길이만큰 read로 읽을때까지 반복하면 해결된다.
에코 클라이언트 이외의 경우에는? 에플리케이션 프로토콜의 정의 : 위의 경우는 수신할 데이터의 크기를 알 경우지만 일반적으로는 그렇지 않다. 이럴 때 필요한것이 어플리케이션 프로토콜.
어플리케이션 프로토콜이란? 클라이언트의 구현과정에서 만들어지는 약속
-TCP의 이론적인 이야기-
TCP 소켓의 생성에서 소멸과정을 크게 3단계로 나눌수 있다.
1.상대 소켓과의 연결 : Three-way handshaking (3번의 shaking에 걸쳐서 이루어진다. 호스트 A가 접속하고자 하는 호스트 B에 패킷을 보내고 B에서는 받은 패킷을 확인하면서 새로운 패킷을 보내고 다시 A가 B에서 온 패킷을 확인하는 과정)
2.상대 소켓과의 데이터 송수신 :
3.상대 소켓과의 연결 종료 : Four-way handshaking으로 호스트 A가 연결을 끊기 위한 패킷을 보내면 호스트 B에서 응답 패킷을 보내고 B에서 다시 한번 종료 패킷을 보내면 A에서는 그 패킷을 보고 연결을 종료한다.