Earn this, Earn it.
TIL - [OSI 7 계층] 전송 계층 본문
하.... 열심히 포스팅 중이던 글이 두 번이나 날라가니까 열 받네요..
(왜 수정중인 글은 임시 저장이 안되냐,,)
OSI 7계층 중 다른 계층에 대한 포스팅은 아래 링크를 참고해주세요! :)
물리, 데이터 링크 계층 : https://hanastro.tistory.com/51
네트워크 계층 : https://hanastro.tistory.com/45
전송 계층 : https://hanastro.tistory.com/54
오늘은 지난 시간에 하지 못했던 전송 계층에 대해 알아보려고 합니다!
전송 계층이란?
물리, 데이터 링크, 네트워크 계층이 목적지에 '데이터를 보내는 것'이 목적이라면
전송 계층은 목적지에 '신뢰할 수 있는 데이터를 전달하는 것'이 목적입니다.
(네트워크 계층에서 다른 네트워크로의 데이터 전송이 도착하지 못하거나 패킷이 손상되는 등의 문제가 생길 수 있기 때문에)
전송 계층은 크게 오류를 점검하거나 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능을 합니다.
여기서 나오는 것이 크게 연걸성 프로토콜인 TCP, 비연결성 프로토콜인 UDP입니다.
TCP 헤더
TCP 헤더가 붙은 데이터를 세그먼트라고 합니다.
TCP 헤더는 아래에서 보는 것처럼 다양한 정보를 가지고 있는데,
출발지 포트 번호, 목적지 포트 번호, 일련번호, 확인 응답 번호, 코드 비트, 헤더 길이 등을 가지고 있습니다.
여기서 코드 비트란 연결의 제어 정보가 기록되는 곳으로, 6비트로 구성되며 그 중 SYN과 ACK 비트를 가집니다.
(그 밖의 다른 비트도 있습니다. FIN, URG 등등...)
3-way 핸드쉐이크
연결은 SYN과 ACK를 사용하여 확립할 수 있는데, 신뢰할 수 있는 연결을 하려면 데이터 전송 전에 패킷을 교환해야 합니다.
이 패킷 교환 과정이 위와 같이 3가지 과정으로 이루어져서 3-way handshake라고 합니다.
(이해를 위해 클라이언트와 서버가 통신을 한다고 가정하겠습니다.)
1. 통신을 하기 위해 클라이언트는 서버에게 SYN 요청을 보냅니다.
2. 서버는 요청을 받은 후 ACK 응답과 함께 자신의 데이터 전송도 허가를 받기 위해 SYN 요청을 보냅니다.
3. 클라이언트는 서버의 SYN을 받은 후 연결을 허가한다는 응답으로 ACK를 보냅니다.
연결을 종료할 때는,
4-way handshake를 사용하는데요
1. 클라이언트는 서버에게 연결 종료 요청 FIN을 보냅니다.
2. 서버는 클라이언트로 ACK를 반환합니다.
3. 서버도 클라이언트로 연결 종료 요청을 보냅니다.
4. 클라이언트는 이에 대한 응답 ACK를 반환합니다.
여기서 4단계로 이루어지는 이유는
Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문입니다.
일련번호(Sequence number)와 확인 응답 번호(Acknowledgement number)
일련번호(Sequence number)는 송신 측에서 수신 측에 이 데이터가 몇 번째 데이터인지 알려주는 역할을 합니다.
확인 응답 번호(Acknowledgement number)는 수신 측이 몇 번째 데이터를 수신했는지 송신 측에 알려주는 역할을 하지요.
예를 들면, 5번 데이터 수신 후 6번 데이터를 송신 측에 요청하는 것이 있고, 이를 확인 응답이라고 합니다.
이처럼 일련번호와 확인 응답번호를 사용해서 데이터나 손상되거나 유실된 경우 재전송을 하게 됩니다.
윈도우 크기(Window size)와 버퍼(Buffer)
매번 세그먼트를 보내고 확인 응답을 기다리게 되면 매우 비효율적입니다.
따라서 한 번에 연속해서 세그먼트를 보내고 확인 응답을 반환하는 방식으로 통신을 하게 됩니다.
여기서 연속으로 받은 세그먼트들을 일시적으로 보관하는 장소가 바로 버퍼(Buffer)입니다.
하지만 대량으로 세그먼트를 보내게 되면 자칫 버퍼가 넘쳐 흐를 수가 있는데(overflow)
이를 방지하고자 버퍼의 한계 크기를 TCP 헤더에 넣고 알려주게 됩니다.
이게 바로 윈도우 크기(Window size)입니다.
이를 통해 확인 응답을 일일이 하지 않고 연속해서 송수신할 수 있게 됩니다.
포트 번호
전송 계층의 두 번째 역할인 전송된 데이터의 목적지가 어떤 애플리케이션인지 구분하는 역할을 위해 포트 번호에 대해 알 필요가 있습니다.
포트 번호 중 0~1023번 포트는 주요 프로토콜이 사용하도록 예약되어 있으며 주로 서버측 애플리케이션에 사용되며 잘 알려진 포트(well-known ports)라고 합니다.
1025번 이상은 랜덤 포트라고 해서 주로 클라이언트 측의 송신 포트로 사용됩니다. (1024번은 예약되어 있지만 사용하지 않는 포트라고 하네요)
80번은 HTTP, 443번은 HTTPS로 예약되어 있다는 것은 다들 아시죠?ㅎㅎ
TCP 헤더에는 출발지 포트 번호와 목적지 포트 번호가 기록되어 있는데 이를 통해 어떤 애플리케이션인지 구분하게 됩니다.
예를 들어, 배달원이 택배를 102동 301호에 사는 사람에게 가져다 준다고 가정해보면
102동이라는 주소는 하나의 네트워크 주소, 즉 IP주소라고 볼 수 있고
301호라는 주소는 그 네트워크 내에서 나의 애플리케이션 위치, 즉 포트 번호라고 볼 수 있죠.
UDP 헤더
UDP는 대표적으로 비연결형 통신을 하는 프로토콜로서, 동영상 서비스와 같은 곳에 주로 사용됩니다.
이 프로토콜은 신뢰성이나 정확성보단 효율성을 중요하게 생각하기 때문에
헤더에도 출발지 포트 번호, 목적지 포트 번호, 길이, 체크섬 정도만 기록됩니다.
이런 UDP 헤더가 붙은 데이터를 UDP 데이터그램이라고 하며
UDP를 이용하면 앞서 네트워크 계층에서 살펴보았던 브로드캐스트가 가능합니다.
(TCP는 3-way handshake 과정이 필요하기 때문에 확인 응답을 하나씩 보내줘야 합니다. 따라서 불특정 다수에게 보내는 통신에는 적합하지 않습니다.)
후 여기까지 전송 계층에 대해 간략히 알아보았는데요,
이번 포스팅은 글이 2번이나 날라가는 관계로 매우 힘든 작업이었네요...
다음 시간에는 마지막으로 응용 계층에 대해 알아보도록 하겠습니다!
'[개발 공부]' 카테고리의 다른 글
[TIL] 기술부채 청산하기 - 2월 셋째 주 (2) | 2022.02.20 |
---|---|
[읽고 정리하기] 함수형 자바스크립트 - 2장(1) (4) | 2022.02.02 |
[읽고 정리하기] 함수형 자바스크립트 - 1장 (1) | 2021.12.18 |
TIL - [OSI 7 계층] 물리/데이터 링크 계층 (2) | 2021.12.12 |
TIL - UTF-8이란? (0) | 2021.12.10 |