OSI 모델에서 보았듯 전송계층은 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요하다.
전송계층에는 오류를 점검하는 기능이 있어 오류가 발생하면 데이터를 재전송하도록 요청한다.
뿐만 아니라, 한 가지 기능이 더 있다. 바로 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능도 있다.
지금 전달하고자하는 프로그램이 웹브라우저에서 사용하는 것인지, 메일프로그램인지 식별해주는 기능을 이 전송계층에서 하게 된다.
연결형 통신과 비연결형 통신
전송계층의 키워드는 신뢰성, 정확성, 효율성이다.
전송계층은 데이터를 목적지에 문제없이 전달하는 것을 목표로 한다. 정확하게 전달하는 것을 목표로 하는 것을 연결형 통신이라 하고 효율적으로 데이터를 보내는 것을 비연결형 통신이라고 한다.
말이 어려운데, 쉽게 직관적으로 이해하고자 하면 동영상 스트리밍을 생각하면 쉽다.
동영상 스트리밍을 할때에는 정확한 데이터를 받는 것도 중요하지만 끊기지 않고 볼 수 있는 것도 중요하다.
그리고 동영상 데이터의 경우 데이터가 조금 완벽하지 않더라도 동영상을 막힘없이 보는 것이 더 좋으니 말이다.
이 두 개 통신의 프로토콜이 다르다. 연결형에는 TCP를 사용하고 비연결형에는 UDP를 사용한다.
TCP
데이터 송신측에서 수신측으로 데이터를 보낼 때 붙에는 헤더를 TCP 헤더라고 부른다. 그리고 이 TCP헤더가 붙은 부분을 세그먼트라고 한다.
[ TCP 헤더 ]
위에서 TCP 프로토콜은 연결형 통신에 사용된다고 말한 적 있다. 데이터를 전송하기 전에 해야하는 작업이 있다.
데이터를 전송하려면 먼저 연결(connection)이라는 가상의 독점 통신로를 확보한 후에야 데이터를 전송할 수 있다.
그럼 어떻게 그 연결을 확립할까?
위의 그 그림에서 코드비트 부분을 다시 한번 보자.
이 코드비트는 TCP 헤더의 107번째 비트부터 112번째까지의 비트로 연결의 제어정보가 기록되는 곳이다.
[ TCP 헤더와 코드비트 ]
각 코드비트는 역할이 있다. 연결을 확립하려면 SYN(연결요청), ACK(확인응답)이 필요하다.
3-Way 핸드셰이크
SYN과 ACK를 사용하여 연결을 하기 전 다음과 같은 과정을 거친다.
- 통신을 하려면 컴퓨터 2에게 허가를 받아야 하므로, 먼저 컴퓨터 1에서 컴퓨터 2로 연결확립 허가를 위한 요청(SYN)을 보낸다.
- 컴퓨터 2는 컴퓨터 1이 보낸 요청을 받은 후에 허가한다는 응답을 회신하기 위해 연결응답(ACK)를 보낸다. 동시에 컴퓨터 2도 컴퓨터1에게 데이터 전송 허가를 받기위해 연결 확립 요청(SYN)을 보낸다.
- 컴퓨터 2의 요청을 받은 컴퓨터 1은 컴퓨터 2로 허가한다는 응답으로 연결 확립 응답(ACK)를 보낸다.
이처럼 데이터를 보내기 전 연결을 확립하기 전에 패킷 요청을 세 번 교환하는 것을 3-way 핸드셰이크라고 한다.
핸드셰이크는 악수를 의미하는데, 우리가 상대방을 신뢰할 수 있는지 악수로 확인하는 것처럼, 확실하게 데이터가 전송되었는지 확인하면서 이루어지는 통신수단이다.
연결을 끊을 때는 FIN과 ACK를 사용한다.
[ FIN과 ACK를 사용한 연결 종료 ]
- 컴퓨터 1에서 컴퓨터 2로 연결 종료 요청(FIN)을 보낸다.
- 컴퓨터 2에서 컴퓨터 1로 연결 종료 응답(ACK)를 반환한다.
- 컴퓨터 2에서도 컴퓨터 1로 연결 종료 요청(FIN)을 보낸다.
- 컴퓨터 1에서 컴퓨터 2로 연결 종료 응답(ACK)를 반환한다.