Transport layer에는 UDP와 TCP 두 가지 방식이 존재한다.
프로세스에서 메세지를 보낼 때 알맞은 목적지 프로세스에 보내는 방식이다.
Multiplexing(sender)
: 소켓에 의해 application 계층에서 transport 계층으로 메세지가 내려온다. 이때, 여러 개의 메세지가 들어오는 것을 하나의 segment로 만들어주기 때문에 multiplexing이라고 한다.Demultiplexing(receiver)
: segment에서 메세지를 꺼내고 application 계층의 여러 프로세스 중 알맞은 프로세스에게 메세지를 전달해주는것이 demultiplexing이다. (들어오는것은 하난데 여러 개의 프로세스 중에 단 한곳에 전달해야하기 때문)TCP와 UDP 모두 Multiplexing과 Demultiplexing을 하지만 방식에서 차이가 있다.
UDP
: Connectionless transport. 즉, 별도의 커넥션 없이 port 번호만 보고 주고 받는다.TCP
: Connection-oriented transport. 수신자 소켓과 발신자 소켓이 1:1 관계이다. (고유함)각 레이어는 상위 레이어에게 서비스를 제공하고 하위 레이어에게 서비스를 제공받는다.
UDP는 아무것도 안해주는것 같지만, multiplexing, 데이터 에러 체킹(에러가 나면 receiver의 프로세스가 있는 application 레이어에게 전달해주지 않는다.)을 해준다.
그렇다면 TCP는 무엇을 해줄까? reliable, in-order delivery, flow control 등 다양하게 존재하지만, 가장 첫 번째로 주목해야할 점은 reliable이다.
reliable이란 애플리케이션에서 내려온 메세지가 하나도 유실되지 않고, 에러없이 receiver의 application layer로 전달되는 것을 의미한다.
반대로 unreliable한 상황도 존재하는데, 이는 아래와 같은 상황을 나타낸다.
패킷에 에러가 발생했거나, 패킷이 유실된 상황 이 두 가지 상황만 잘 처리하면 어떻게든 reliable하게 만들 수 있다.
이 때 발생할 문제는 없다.하위 계층이 완벽하다면 그냥 위에 있는 layer에서 데이터를 받아 아래에 있는 layer에 전달하면 된다.
✅ error detection
checksum(실제 패킷에 담긴 메세지에 에러가 있는지 없는지 판단하기 위한 장치)
을 이용한다.
✅ feedback : ACK(acknowledge)
/ NAK(negative acknowledge)
sender는 패킷을 보내고 feedback으로 ACK를 받으면 다음 패킷을 전송, NAK를 받으면 재전송한다.
✅ fatal flaw (치명적 결함)
만약 feedback 자체가 에러일 경우는 어떻게 할까?
sequence number
. 넘버링을 하면 중복 체크가 가능하다. sequence number
의 크기를 ++ 시키면 header의 크기는 무한대로 늘어나기 때문에 0
과 1
로 구분한다. feedback은 무조건 ACK를 보내는데, 마지막에 제대로 받은 sequence number로 ACK와 NAK를 판단한다.
✅ Timer
sender는 packet을 보내면서 timer를 작동 시키고 timeout이 발생하면 loss로 인식해 재전송한다.
ex ) window size = 4
1
~4
까지 보내고, window는 전진하다가 window가 4
~7
을 전달한다.4
에 유실이 있었을 경우 5
~7
을 전달 받아도 receiver가 기다리던 4
가 아니기 때문에 들어온 데이터 전부 drop하고 feedback은 ACK(3)을 보낸다. 4
번부터 7
번까지 재전송 해야하는 비효율이 발생한다.n만큼 다시 돌아온다고해서 Go-Back-N이라고 한다.
Go-Back-N
의 비효율을 개선.ex ) window size = 4
1
~4
까지 보내고, window는 전진하다가 2
번 패킷에 loss가 발생했지만 3
번과 4
, 5
번까지는 도착했다. 2
번을 제외한 3
~5
번은 buffer에 저장해두고, 다른 패킷들을 보내다가 2
번에 대한 time out이 발생하면 2
번 패킷만 다시 재전송한다.2
~5
번까지 순서대로 저장되었다면 application layer로 전송한 후 ACK(2)를 전송한다.3
~5
번도 buffer에 저장될 때 해당하는 번호를 ACK에 담아 전송한다.)Selective repeat는 loss가 발생한 패킷만 재전송 함으로써 네트워크에 부담을 줄일 수 있다.
sequence number는 더 이상0
과 1
만으로 표현이 되지 않으며, window size만큼의 sequence number를 가진다 해도 문제가 발생한다.
예를 들어 window size가 4라고 가정할 때, sequence number는 0
~3
이게 된다.
sender가 0
~3
번까지의 패킷을 보냈지만 0
번에 대한 패킷이 loss가 일어났을 때 receiver의 buffer에는 0
번을 제외한 1
~3
번까지의 패킷이 저장되어 있다.
이 때, 0
번에 대한 패킷을 전달한다면 receiver 입장에선 새로운 0
번의 패킷일지 기존의 0
번에 대한 패킷일지 알 수 없다는 것이 dilemma가 된다.
따라서, seqeunce number는 window size의 2배 이상이 되어야 한다.