4계층에서 동작하는 프로토콜은 통신해야할 목적지 프로세스를 정확히 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내기 위한 역할을 한다.
Application 계층을 통해 통신할 데이터를 전달하기 위해서 하위 계층인 1~4 계층에서는 인캡슐레이션을 통해 데이터를 원하는 목적지에 패킷 네트워크 형태로 나눠서 통신 가능한 전기 신호로 변환하는 과정을 거친다. 그리고 이 데이터가 각 계층에 필요한 정보들로 하나하나 데이터로 변환되어가는 과정을 디캡슐레이션이라고 한다.
인캡슐레이션을 할 때 정말 중요한 정보 두가지가 있다.
가장 많이 사용하고 있는 TCP/IP 프로토콜 스택의 4계층은 TCP와 UDP를 사용한다. 4계층에서는 데이터를 필요한 어플리케이션에 전달하는 것을 목적으로 가진다. 이 TCP와 UDP를 알아보려고 한다.
TCP 프로토콜은 통신 도중 데이터의 유실을 막아주는 역할을 한다. 데이터를 여러 패킷을 나누고 그 패킷에 보낼때 시퀀스 번호를 붙이고 응답으로 오는 ACK번호를 보고 순서에 맞게 패킷을 보내 데이터 유실이 없는 통신을 가능하게 만든다.
패킷 순서, 응답 번호
분할된 패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호라고 부른다.
윈도 사이즈와 슬라이딩 윈도
패킷을 나눠서 보낼때 패킷을 보내고 응답을 받으면 다시 다음 패킷을 보내는 과정을 매번 반복한다면 많은 시간이 걸릴 것이다. 그래서 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한꺼번에 보내고 응답을 한번만 받는 방법을 사용한다. 이때 너무 많이 보내면 유실 가능성이 커지기 때문에 적당한 전송량을 결정하게 되는데 이때 한 번에 전송한느 데이터의 크기를 윈도 사이즈라고 한다. 그리고 이 윈도 사이즈를 조절하는 것을 슬라이딩 윈도라고 한다.
3방향 핸드쉐이크
패킷 네트워크는 많은 상대방과 동시에 통신을 하기 때문에 각 통신에 대한 리소스를 미리 확보하는 작업이 필요하다. TCP에서는 3번 패킷을 주고 받으면서 통신 준비를 하는 것을 '3방향 핸드쉐이크'라고 부르다. 패킷을 보내고 받을 때마다 상태가 변하게 되는데
송신자 수신자 간의 TCP 프로토콜을 통해 패킷을 주고 받을 때 TCP Header 안에 상태와 현재 몇번의 seq, ack 번호인지 header에 정보를 담아서 상태를 확인한다.
URG, ACK, PSH, RST, SYN, FIN 모두 상태를 나타내며 각 자리는 1비트의 값을 표현할 수 있고 SEQ, ACK에 1이 표시가 되면 32비트로 이루어진 시쿼스 번호와 ACK 번호에 1을 추가하면서 상태를 확인할 수 있다.
UDP는 TCP와 다르게 전송의 신뢰성 보다는 속도나 연결에 문제가 없어야 하는 상황에서 사용한다. 전송의 신뢰성이 보장되지 않다보니 제한된 경우에 사용되는데 다소 일부 데이터가 유실되는 것이 통신이 멈추는 것보다 더 좋은 상황에 사용하는데 생중계나 실시간 스트리밍 서비스 같은 경우가 이에 해당한다. 다소 화질이 잠시 떨어져 보여도 통신이 계속 유지되는 것이 더 중요한 상황이다.
UDP는 3방향 핸드쉐이크 과정이 없다.