이 포스팅은 공부 목적으로 작성된 포스팅입니다. 왜곡된 내용이 포함되어 있을 수 있습니다.
section 2.1에서 살펴 봤듯 network application은 client program와 server의 program으로 각각 서로 다른 end system에 거주하는 형태로 이루어져 있다.(서로 다른 호스트라는 관점에서 그러하다) 두 프로그램이 실행될 때, client process와 server process가 생성되어, 이러한 process가 socket을 통해 서로 읽고 쓰게 된다.
network application에는 2가지 유형이 있는데 첫번째는 RFC와 같은 protocol 표준이 존재하는 "open" 된 구현 방식으로 HTTP로 통신하는 client application과 server application이 그예이다.
두번째는 특정 인원에게 소유된 network application으로 이 경우, client와 server program은 application-layer protocol을 사용하여 개발자가 프로토콜을 전부 제어하게 된다. 당연히 "close"되어 있고, 해당 protocol을 지원하지 않는 application과 호환되지 않는다.
이번절에 TCP와 UDP를 통해 application이 어떻게 개발되는지 알아보자
2.7.1 socket programming with UDP
각 process들은(client process, server process) 집과 비슷한데 socket은 집에서 문에 해당한다. application은 문 안쪽에 위치하고 transport-layer protocol(TCP, UDP)는 문 밖에 위치한다. 개발자는 집에 있는 것들만 제어할 수 있다. 문 밖은 제어 할 수 없다.
UDP socket을 사용하는 두개의 process사이의 interaction에 대해 살펴보자. process가 packet을 socket(door)에 보내기 전에, 먼저 목적 주소에 packet을 부착한다. packet이 송진자의 socket에 보내진다면 internet는 목적 주소지에 수진자 process의 socket에 packet을 route한다. packet이 수신자 socket에 도착하면 수신자 process는 socket을 통해 packet을 받고, 로직에 맞게 처리한다.
목적지 주소를 어떻게 packet에 붙일까? 목적지 host ip주소를 부착해야한다(목적지 주소의 일부이다.) host들은 여러개의 nework application processes를 실행하고 있는데, 소캣을 구별하기 위한 식별자가 필요하다. 따라서 socket이 생성될때 port number라고 부르는 식별자를 socket에게 부여한다. 따라서 packet을 보내기 위해서는 목적지 host의 ip주소와 port number을 모두 부착해야한다. 물론 송신자의 주소에도 송신지 host의 ip주소와 port number가 함꼐 있다. 이러한 packet 에 address 부착를 부착하는 것은 OS 단에서 자동으로 수행된다.
아래 로직을 실행하면 그림과 같다.
- client은 server에게 data를 보낸다.
- server는 받은 data를 대문자로 변경한다.
- server는 수정된 data를 client에 보낸다.
- client는 수정된 data를 받는다.
구현 생략
2.7.2 Socket Programming with TCP
UDP와 다르게 TCP는 연결 지향 protocol이다. client와 server간의 데이터 전송 이전에 handshake와 TCP connection을 맺어야한다. TCP connection은 client socket과 server socket에 부착되어야한다. TCP connection을 생성하기 위해 client socket과 server socket이 교신해야한다. TCP connection이 맺어지면, 서로 데이터 교환이 가능해진다. 이때 packet에 목적지 address를 부착할 필요 없이 TCP connection에 drop하기만 하면 된다.
server process가 실행되면 client process는 server에게 TCP connection을 시작한다. 이때 client에서 TCP socket을 생성하고 이때, server의 socket address(ip+port)를 명시한다. server에서도 socket을 생성하면 client는 3-way-handshake를 시작하고 TCP connection을 맺는다. transport layer에서의 3-way-handshake은 따로 보이지 않는다.
client process에서 server process의 welcome door(client process를 받을 수 있는 별도의 socket)를 노크한다. server에 노크 소리를 들으면 server에서는 새로운 문, socket을 생성한다. welcome door를 serverSocket, 생성된 새로운 socket을 connectionSocket이라고 한다.
application 관점에서 client의 socket 과 server의 socket은 pipe로 연결되어 있다. client process는 무작위의 byte를 socket에 보낸다. TCP는 server process가 data를 받는 것이 보장된다. 따라서 TCP는 신뢰성있는 service를 제공할 수 있게된다.