프로토콜 표준에서는 Socket이란 고유한 식별자로써 IP주소:포트번호로 각 클라이언트 및 서버를 식별하고, 클라이언트와 서버가 커넥션을 생성할 경우 커넥션을 유니크하도록 보장해준다.

link, internet, transport layer들은 애플리케이션이 사용할 수 있도록 네트워크 기능을 지원하며 시스템 레벨에서 구현된다.

application layer는 실제 네트워크 기능을 사용하며 애플리케이션 레벨에서 구현된다.

애플리케이션은 시스템의 자원을 마음대로 사용해서는 안된다. 때문에 애플리케이션에 제약을 걸어줄 무언가가 필요.

시스템은 애플리케이션이 네트워크 기능을 사용할 수 있도록 프로그래밍 인터페이스를 제공하고 애플리케이션은 인터페이스를 통해 데이터를 주고 받는다. 해당 인터페이스를 socket이라 한다.
개발자는 socket programming을 통해 네트워크 상의 다른 프로세스와 데이터를 주고 받을 수 있도록 구현한다.

대부분의 시스템은 socket 형태로 네트워크 기능을 제공한다.
개발자가 보통 socker을 직접 조작해서 통신 기능을 구현할 일은 적다.
ex) 라이브러리, 프레임워크를 사용하면 보통 내부에서 소켓을 활용해 기능을 구현해놓았다.

port는 socket을 식별하기 위해 부여되는 숫자.
socket은 <protocol, ip address, port number>로 정의된다.

프로토콜 표준에서는 socket은 유니크하게 식별되지만, 프로토콜 스펙을 시스템 레벨에서 구현하면서 달라질 수 있다.

UDP의 경우 socket은 유니크하게 식별되지만, TCP의 경우 유니크하게 식별되지 않는다.
TCP의 경우 socket이 유니크하게 식별되지 않는다. 그러면 어떻게 구현을 해야할까

커넥션 생성 요청을 기다리는 socket


listening socket은 커넥션을 맺기위해 커넥션 요청을 기다리는 socket이고, 3-way handshake를 통해 커넥션이 생성되면, listening socket은 그대로 있고, 새로운 socket이 생성되어 커넥션을 유지한다.

listening socket과 새로 생성된 3개의 TCP socket들은 IP주소 와 포트번호가 모두 동일하다.


세개의 socket의 protocol, IP주소, 포트번호가 모두 동일하기 때문에 socket을 식별할 수 있는 방법이 필요하다.
커넥션이 존재하지 않을때 커넥션 연결 요청은 반드시 listening socket으로 하고, 커넥션이 연결된 후 <요청 IP주소, 요청 port, 응답 IP주소, 응답 port>로 호스트를 특정하고 socket을 식별한다.

서로 다른 커넥션들이 도착지 같은 IP 주소와 port 번호를 사용하고 있기 때문에, 도착지 IP주소와 port만으로는 socket을 식별할 수 없다. 따라서 통신 할 경우 header에 <요청 IP주소, 요청 port, 응답 IP주소, 응답 port> 정보를 담고 데이터 호스트에서는 헤더에 담긴 출발 IP와 출발 port를 확인하고 socket을 식별하여 데이터를 송수신 한다.
즉, <요청 IP주소, 요청 port, 응답 IP주소, 응답 port>에 대한 정보가 모두 있어야 socket을 유니크하게 식별할 수 있다.



클라이언트의 IP주소와 port를 사용하여 다른 socket과 커넥션을 연결할 수 있다.
<src IP, src port, dest IP, dest port>가 중복되지 않는 이상, 하나의 IP와 port번호로 여러 커넥션을 연결할 수 있다.

프로토콜 표준과 실제 동작방식에 차이가 존재한다.

UDP socket의 경우 IP주소와 port만으로 socket을 유니크하게 식별할 수 있다.



