Post date: Nov 30, 2016 3:38:56 AM
1. TCP는 연결-지향형 통신이고, UDP는 비연결형 통신이다. TCP는 통신 종단점으로 자료를 전송하기 위해 먼저 클라이언트가 연결 요청 메시지를 보내고, 서버는 이를 수학한다. 일단 클라이언트와 서버 간의 연결이 맺어지면 각각 표준 read, write 함수를 이용하여 대칭적 양방향 통신을 사용한다. 각 종단점에는 클라이언트와 서버가 존재한다. 양단 모두에서 연결을 닫을 수 있고, 이 경우 다른 쪽은 읽기와 쓰기 명령 시에 이를 감지한다. 따라서 TCP 통신을 사용하는 애플리케이션은 언제 작업이 완료되었는지를 원격지로 알릴 수 있다. 반면 다수를 대상으로 자료를 전송하고 받는 애플리케이션은 UDP를 사용한다. 각 메시지들은 대상 주소를 포함하고 있어야 한다. UDP는 원격지의 실행 유무를 애플리케이션에 알랄 수 없다.
2. TCP는 바이트 스트림 기반이고, UDP는 메시지 기반이다. 애플리케이션이 한 번의 sendto 함수를 이용하여 UDP 메시지를 전달하면, 반대편 종단점은 recvfrom을 호출하여 메시지 전체를 가져오거나 그렇지 못할 것이다. 반대로 한 번의 TCP write를 이용하여 데이터 블록을 전송하는 애플리케이션은 수신 측이 한 번의 read를 통해 전체 데이터를 읽을 수 있다는 점을 보장하지 않는다. 한 번의 read 명령은 연속된 바이트를 스트림의 형태로 가져온다. 이 과정은 데이터 블록의 전체 혹은 부분일 수 있고, 여러 데이터 블록일 수 있다.
3. TCP는 전송한 순서에 맞게 바이트 스트림을 전송한다. UDP는 네트워크 상의 에러가 없다는 가정을 하더라도 전송된 순서와 상관없이 메시지를 받는다. UDP는 받은 순서대로 애플리케이션에 메시지를 전달한다. 각 UDP 패킷은 인터넷 상에서 각각 다른 통신로를 따라 전달될 수 있기 때문에 보내진 순서대로 도착하지 않을 수 있다. 반대로 수신 측 호스트의 네트워크 하부 시스템은 TCP 패킷을 버퍼에 저장하고, 애플리케이션에게 전송된 순서에 맞게 메시지를 전달하기 위해 순서 번호를 사용한다.
4. TCP는 신뢰할 수 있고, UDP는 신뢰할 수 없다. 만약 TCP가 원격지로 데이터를 전송할 수 없다면 에러를 리턴하여 실패 여부를 알린다. UDP는 그렇지 못하다. 네트워크에서 UDP 패킷이 손실될 수 있고, 이 경우 메시지는절대 원격지로 전달되지 않는다. UDP는 수신 측과 송신 측에게 에러가 발생되었다는 사실을 알릴 수 없다.
5. UDP sendto 함수와 TCP write 함수는 보낼 메시지를 호스트의 네트워크 하부 시스템 버퍼로 복사한 후 리턴한다. UDP의 리턴은 수신 측의 상태와 무관하게 이루어진다. 반면 TCP의 리턴은 어느 정도 수신 측과 네트워크의 상태에 의존한다. TCP 네트워크 하부 시스템은 수신 측 호스트가 확인 패킷을 보내지 않음으로써 수신 측에 충분한 버퍼가 없다고 인지하거나 네트워크 트래픽이 혼잡할 수 있기 때문에 전송할 데이터를 버퍼에 보관할 수있다. 보관된 데이터로 인해 이 후 실행되는 write 함수가 블록될 수 있다. TCP 프로토콜이 제어를 하더라도 TCP write 함수의 리턴을 데이터가 원격 호스트로 전송되었다는 것으로 해석하지 말아야 한다.