OSI모델 중 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요한 전송 계층에 대한 내용을 정리합니다.
물리 계층, 데이터 링크 계층, 네트워크 계층을 통해 목적지에 데이터를 보낼 수 있다. 하지만 이 데이터가 손상되거나 유실되는 문제는 관리하지 못한다. 전송 계층에는 오류를 점검하는 기능이 있기 때문에 목적지까지 신뢰할 수 있는 데이터를 전달할 수 있도록 한다. 뿐만 아니라 목적지 컴퓨터에 도착한 데이터를 어떤 애플리케이션에 전달해야할 지 식별하는 기능도 있다.
- 전송 계층의 2가지 역할
- 목적지에 신뢰할 수 있는 데이터가 갈 수 있도록 오류를 점검하는 기능
- 전송된 데이터가 어떤 애플리케이션에 가야하는지 식별하는 기능
- 2가지 통신방법
- 연결형 통신 : 데이터를 목적지까지 문제없이 전달하도록 신뢰성과 정확성에 초점을 둔 통신
- TCP 프로토콜 사용
- 비연결형 통신 : 데이터를 빠르고 효율적으로 전달하도록 효율성에 초점을 둔 통신
- UDP 프로토콜 사용
- 연결형 통신 : 데이터를 목적지까지 문제없이 전달하도록 신뢰성과 정확성에 초점을 둔 통신
TCP 구조
TCP란 연결형 통신에 사용되는 프로토콜이다. TCP프로토콜로 전송할 때 전송 계층에서 붙이는 헤더를 TCP헤더라고 하며, 데이터에 TCP헤더가 붙은 것을 세그먼트(segment)라고 한다.
TCP헤더에는 출발지 포트 번호, 목적지 포트 번호, 일련번호, 확인 응답 번호, 헤더 길이, 예약 영역, 코드 비트, 윈도우 크기, 체크섬, 긴급 포인터, 옵션까지 총 11개의 정보가 있다.
3-way 핸드셰이크
연결형 통신을 통해 데이터를 전달하기 전에 먼저 연결(connection)이라는 가상의 독점 통신로를 확보해야 한다. 연결에 관한 정보는 코드 비트에 기록된다.
코드 비트는 비트별로 역할이 있다. 연결을 확립하려면 ACK와 SYN이 필요하다. 초기값은 0이고 비트가 활성화되면 1이 된다.
- SYN : 연결 요청
- ACK : 확인 응답
연결(connection)을 확립하기 위해 SYN과 ACK를 사용하여 데이터 전송 전 패킷을 교환한다.
- 컴퓨터1에서 컴퓨터2로 연결 확립 허가를 받기 위한 요청 SYN을 보낸다.
- 컴퓨터2는 컴퓨터1의 요청을 허가한다는 응답 ACK을 보내고, 동시에 컴퓨터2도 컴퓨터1에게 데이터 전송 허가를 받기 위해 연결 확립 요청 SYN을 보낸다.
- 컴퓨터1은 컴퓨터2의 요청을 허가한다는 응답 ACK를 보낸다.
이처럼 데이터를 전송하기 전에 패킷 요청을 교환하며 연결을 확립하는 것을 3-way 핸드셰이크(three-way handshake)라고 한다.
연결을 끊을 때는 FIN과 ACK를 사용한다.
- FIN : 연결 종료
- ACK : 확인 응답
일련번호와 확인 응답 번호 구조
3-way 핸드셰이크 이후 데이터 전송을 할 때는 TCP헤더의 일련번호와 확인 응답 번호를 사용한다.
- 일련번호 : 데이터를 분할해서 보내면서 송신 측에서 이 데이터가 몇 번째 데이터인지 수신 측에 알려주는 역할
- 확인 응답 번호 : 수신 측이 몇 번째 데이터를 받았는 지 송신 측에 알려주는 역할
3-way 핸드셰이크 단계에서 데이터 통신에 사용할 일련번호 3001과 확인 응답 번호 4001이 결정된다.
- 컴퓨터1은 컴퓨터2로 200바이트의 데이터를 전송한다. 이 데이터의 첫번째 바이트의 일련번호는 3001이다.
- 컴퓨터2는 200바이트를 수신한 후, 그 다음에 수신하고자 하는 3001+200 = 3201번 데이터를 요청한다.
- 컴퓨터1은 컴퓨터2로 3201번부터 200바이트를 전송한다.
- 컴퓨터2는 200바이트를 수신한 후, 그 다음에 수신하고자 하는 3201+200 = 3401번 데이터를 요청한다.
이처럼 일련번호와 확인 응답 번호를 사용해서 데이터가 손상되거나 유실되는 경우를 확인할 수 있고, 이 경우 재전송제어를 통해 데이터를 재전송하도록 한다.
윈도우 크기
세그먼트(TCP헤더+데이터)를 하나 보낼 때마다 확인 응답을 한 번 반환하였다. 이처럼 매번 응답을 반환하면 효율이 높지 않다. 매번 응답을 기다리는 대신 세그먼트를 연속해서 보낸 후, 한 번에 응답을 반환하면 효율이 높아진다. 수신 측의 컴퓨터에는 세그먼트를 일시적으로 보관하는 버퍼(buffer)라는 것이 있다. 하지만 세그먼트를 대량으로 받는 경우, 처리하지 못하여 오버플로(overflow)가 발생한다. 따라서 오버플로가 발생하지 않도록 버퍼 한계 크기를 TCP헤더의 윈도우 크기(window size)에 지정한다.
컴퓨터 간 윈도우 크기는 3-way 핸드셰이크를 할 때 알게 된다.
윈도우 크기를 고려하여 연속적으로 세그먼트를 보내면 아래 그림과 같이 더욱 효율적으로 통신하게 된다.
포트 번호의 구조
전송 계층의 역할에는 목적지에 신뢰할 수 있는 데이터가 갈 수 있도록 하는 것 외에, 어떤 어플리케이션으로 데이터를 전송해야 하는 지를 식별해야하는 것이 있다. 바로 이 포트 번호(port number)가 데이터의 목적지가 어떤 프로그램인지 구분하는 역할을 한다.
TCP헤더에는 출발지 포트 번호와 목적지 포트 번호가 있다. 포트 번호는 0~65535번을 사용할 수 있으며, 0~1023번 포트는 주요 프로토콜이 사용하도록 예약되어 있다. 이러한 포트를 잘 알려진 포트(well-known ports)라고 한다. 일반적으로 사용하는 서버 측 어플리케이션에 사용된다.
1024번은 예약되어 있지만 사용하지 않는 포트이고, 1025번 이상은 랜덤 포트라고 해서 클라이언트 측의 송신 포트로 사용된다.
어플리케이션은 각각 포트 번호가 있어서 다른 어플리케이션과 구분된다. 특정 컴퓨터로 데이터를 전송할 때는 IP주소가 필요하지만, 어떤 어플리케이션이 사용되는지 구분할 때는 포트 번호가 필요하다.
이어서 다음 포스팅에서 응용 계층에 대한 내용을 다룰 것이다.
[reference]
'CS > 네트워크' 카테고리의 다른 글
[Network] OSI 모델의 응용 계층 (0) | 2022.03.15 |
---|---|
[Network] OSI 모델의 네트워크 계층 (0) | 2022.03.10 |
[Network] OSI 모델의 데이터 링크 계층 (0) | 2022.03.09 |
[Network] OSI 모델의 물리 계층 (0) | 2022.03.08 |
[Network] 프로토콜 , OSI 모델 , TCP/IP 모델 , 캡슐화와 역캡슐화 (0) | 2022.03.07 |
댓글