이 포스팅은 공부 목적으로 작성된 포스팅입니다. 왜곡된 내용이 포함되어 있을 수 있습니다.
이번 절에서 transport-layer multiplexing 과 demultiplexing 을 통해 network-layer에서 host 간의 delivery를 process간의 delivery로 확장하는 것에 대해 알아보자. 이를 위해 internet에 존재하는 transport-layer service를 생각해볼 것이다,
tranport-layer는 network-layer에게 segment를 받는다. 이에 transport-layer는 적절한 process로 해당 segment를 전달해야한다, 수신자의 transport-layer는 data를 process에게 바로 전달하지 않고, 중간 socket에게 전달한다.(UDP의 경우 해당 socket에게 전달, TCP의 경우 server socket에게 전달)
수신자의 transport-layer segment에는 field가 존재한다. 해당 field를 통해 적절한 socket을 찾을 수 있다. 이러한 작업을 demultiplexing이라고 한다.(UDP는 port number, TCP는 port number + ip address) 서로다른 socket에서 source host 으로 data chunk을 수집하여 header capsulate하여 segment을 생성하고 이러한 segment을 network-layer로 전달하는 것을 multiplexing이라고 한다.
하나 주의해야할점은 이러한 다중화, 역다중화가 transport layer 뿐만 아니라 상위 계층에서도 사용될 수 있는 것이다(어떻게 사용되)
이제 실제로 host에서 어떻게 처리되는지 알아보자 socket은 고유한 식별자를 가지고, segment은 socket에 대한 field가 존재해야한다. port number은 16진수로 0~65535 이고 이중 ~1023까지는 well-known port number이다.
HTTP: 80, FTP: 20, 이다, transport layer에서 segment의 port number을 확인하여 해당 socket으로 연결한다. UDP는 이와 같이 진행되는 것과 달리 TCP는 약간 다르다.
TCP의 역다중화를 살펴보자
tcp는 총 4개의 tuple(송신 port, 송신 ip, 수신 port, 수신 ip)으로 식별한다. 4개 값을 모두 사용하여 역다중화가 진행된다.
welcome socket가 12000 port에 존재한다고 생각해보자. host OS에서 12000 port로 들어오는 segment를 받으면 connection을 위해 accept을 기다린다. 이후 새로운 socket을 생성한다. 4가지 값으로 식별한다(하나만 달라도 다른 통신이다) connection이 완료되면 역다중화를 진행한다.
외담으로 열려있는 port에 대해서 buffer overflow attack을 진행하기도 한다.
또한 source가 다르다면 동한 dest에 대해서도 접근이 가능해진다.
오늘날 web server는 하나의 process만을 사용하고 socket connection을 위해 thread를 생성합니다.(socket-thread에 mapping)
만약 persistent HTTP를 사용한다면 통신중에 동일한 server socket에 대해서 HTTP message를 교환한다. 반대로 non-persistent HTTP를 사용한다면 통신마다 새로운 socket을 생성해야한다.