참고: https://huimang2.github.io/etc/iso-standard-7498
⏳ 네트워크가 뭐지?
네트워크는 컴퓨터, 기기 또는 시스템 간에 데이터와 정보를 공유하고 통신하기 위한 연결된 구조를 가르킵니다.
현재의 인터넷은 OSI모델 대신 TCP/IP 모델을 기반으로 구축되어 있습니다.
두 모델은 모두 네트워크 통신을 이해하고 설명하는 데 사용되는 참조 모델이지만 TCP/IP 모델이 현실 세계에서 더 널리 사용되고 있습니다.
인터넷 프로토콜 스위트(현대 인터넷을 구성하는 핵심 프로토콜과 프로토콜군의 모임)의 기반이되며, 다양한 디바이스 및 서비스 간의 효과적인 통신을 지원하는 핵심 역할을 합니다.
(TCP/IP가 가장 많이쓰이기 떄문에 TCP/IP 프로토콜 슈트라고도 합니다.)
⏳ OSI는 어떻게 태어났을까?
OSI 7계층 모델은 Open Systems Interconnection의 약자입니다.
국제표준화기구(ISO)에 의해 정의된 국제 통신 표준 규약인 OSI는 1980년 제안되었을 때 7개의 주요 계층으로 구성되었다고 합니다.
그러나 OSI 모델이 현실적인 네트워크 및 인터넷 기술의 발전과 함께 현재는 TCP/IP 모델이 표준이 되었습니다.
OSI 7계층 모델과 TCP/IP 모델의 계층화 구조는 계층을 구분하여 파악하기 쉽게 만들어졌고, 이 모델은 현재의 네트워크와 통신 분야에서 표준화와 이해의 기반으로 사용되고 있습니다.
⏳ OSI 7계층 모델 탐구
각 계층은 독립적으로 작용하며 수 많은 프로토콜(데이터를 주고받기 위한 약속)이 존재합니다.
프로토콜에 의해 하위 계층으로 갈수록 헤더가 붙으면서 데이터의 크기는 커집니다.
7층- 응용계층(Apllication Layer)
응용 계층은 응용 서비스를 수행하고 수행자 인터페이스를 제공하는 계층입니다. 대표적인 프로토콜로는
html 문서 전송 프로토콜인 HTTP,
파일 전송 프로토콜인 FTP,
메일 전송 프로토콜인 SMTP 등이 있습니다.
6층- 표현계층(Presentation Layer)
표현 계층은 전송되는 정보의 구문(Syntax) 및 의미(Semantics)에 관여하는 계층으로,
인코딩(Encoding), 데이터 압축(Compression), 암호화(Cryptography) 등 주요한 동작을 수행합니다.
파일의 확장자(txt, jpeg, mp4, html 등)는 이 계층과 관련된 프로토콜입니다.
5층- 세션계층(Session Layer)
세션 계층은 두 컴퓨터 사이에 연결을 형성하고 유지 및 종료하는 기능을 담당하는 계층입니다.
두 컴퓨터사이의 대화 통로이며 데이터의 송수신 타이밍과 방법은 이 계층에서 규정됩니다.
세션 계층의 프로토콜에는 SSH, TLS, RPC 등이 있으며, 데이터 전송 보안과 관련있습니다.
4층- 전송계층(Transport Layer)
전송 계층은 서비스를 구분하고 사용자 사이의 신뢰성 있는 데이터 전달을 담당하는 계층입니다.
이 계층의 프로토콜에는 신뢰성있는 데이터 전송이 목적인 TCP(Transmission Control Protocol)와
빠른 데이터 전송이 목적인 UDP(User Datagram Protocol)가 있습니다.
TCP는 세그먼트(Segment)라는 데이터 단위를 사용하며 UDP는 데이터그램(Datagram)이라는 데이터 단위를 사용합니다.
3층- 네트워크 계층(Network Layer)
네트워크 계층의 데이터 단위는 패킷(packet)이며, 네트워크를 논리적으로 구분하는 계층입니다.
인터넷에서는 IP주소(Internet Protocol Address)라는 논리적 주소를 사용합니다.
이 계층에서는 전송 계층에서 요구하는 서비스 품질(Qos)를 위한 수단을 제공합니다. 또한 라우팅 프로토콜을 통해 데이터를 전송하는 최적의 경로를 찾아냅니다.
관련된 프로토콜에는 IP, ARP, RARP, ICMP, IGMP 등이 있으며,
관련된 장비로는 랜을 연결하는 라우터(Router)가 있습니다.
2층- 데이터 링크 계층(Data Link Layer)
데이터 링크 계층의 데이터 단위는 프레임(frame)이며, 물리적 매체를 통해 데이터를 전달하는 계층입니다.
네트워크 계층에 데이터를 전달하고 물리계층에서 발생하는 오류를 탐지하고 수정하는 기능을 담당합니다.
또한 MAC주소(Media Access Control Address)라는 물리적 주소를 사용하여 각 기기들의 구분을 가능하게 합니다.
이 계층과 관련된 프로토콜에는 HDLC, PPP, LLC 등이 있으며,
관련된 장비로는 데이터를 MAC주소를 기반으로 빠르게 전달하는 스위치(Switch),
2개의 랜을 연결하는 브릿지(Bridge) 등이 있습니다.
1층- 물리계층(Physical Layer)
물리 계층의 데이터 단위는 비트(bit)이며, 네트워크 케이블과 신호에 관한 규칙을 다루고 있는 계층입니다.
통신 케이블의 종류와 신호의 규격 및 무선통신 주파수 설정, 커넥터 형태 등을 정합니다.
⏳ TCP/IP 탐구
인터넷에서 데이터를 주고 받을때 대부분 전송 계층에 속하는 TCP와 네트워크 계층에 속하는 IP를 많이 사용하는데 이를 묶어 TCP/IP 라고합니다. 1960년대 ARPANET(Advanced Research Projects Agency Network) 프로젝트의 일환으로 미국 국방성에서 개발한 통신 프로토콜이며, 현재는 대부분의 컴퓨터가 기본으로 제공하는 인터넷 표준 프로토콜입니다.
TCP/IP 데이터 전송 과정을 4계층으로 나누며, OSI모델과 가르게 각 계층이 서로 종속적입니다.
4층- 응용(Application)계층
L4는 프로그램에 도착한 패킷이 어떻게 처리될지 결정합니다.
개발하는 관점에서 L5~7이 나뉘진 않습니다.
다만, 아주 특수한 경우에는 나뉘지기도 합니다. 때문에 OSI7계층의 5~7은 TCP/IP의 L4하나의 계층처럼 생각해보면 됩니다.
3층- 전송(Transport)계층
전송 계층은 네트워크 양단의 호스트 사이의 신뢰성 있는 전송 기능을 제공합니다.
시스템의 논리 주소와 포트를 가지며, TCP와 UDP가 사용됩니다.
TCP와 UDP를 구현하는 행위를 소켓 프로그래밍이라고 합니다.
TCP의 경우 3 Way-Handshake라는 방식으로 통신하고 4 Way-Handshake라는 방식으로 연결을 끊습니다.
장치간에 연결이 잘 되었는지를 3번의 과정을 통해 확인하여 데이터 전송의 신뢰성을 확보합니다.
한번 가볍게 알아보도록 하겠습니다.
TCP 3 Way- Handshake에 대해 알아보자
TCP의 연결을 초기화 할 때 사용합니다.
SYN(synchronize sequence numbers) - 시퀀스 번호 동기화
ACK(acknowledgements) - 킹정
두 응용프로그램이 데이터 전달 전 커넥션 하는 과정을 3 way-handshake라고 합니다.
이 과정 때문에 TCP는 신뢰도 있는 데이터 전송(반드시 목적지에 도착 한다는 것을 의미)을 보장합니다.
1. 클라이언트가 서버에게 SYN 패킷(시퀸스 번호 동기화)을 요청하고 SYN-SENT(보냈으니 귀기울이고 있을게)상태가 됩니다.
2. SYN을 요청받은 서버는 SYN-RECEIVED(동기화 받았다잉)상태가 되고, SYN과 함께 ACK를 클라이언트에게 응답합니다.
3. SYN + ACK를 응답받은 클라이언트는 ACK를 서버에 요청하고 클라이언트와 서버는 ESTABLISHED(인정받은) 상태가 됩니다.
철수가 클라이언트 영희가 서버라고 가정하고 카톡을 한다면?
철수: 야 우리 사귈래?(SYN)
영희: (카톡을 확인후 읽음)(ACK) 그래 우리 사귈래?(SYN) - (SYN + ACK)
철수: 그래 우리 사귀자(ACK)
[TCP 커플탄생]
TCP 4 Way- Handshake에 대해 알아보자
TCP 는 Connection-Oriented(연결 지향)프로토콜 입니다.
따라서, 4 way-handshake는 논리적인 접속 상태를 종료하기 위해 수행되는 절차입니다.
해당 과정을 통하여 sever, client는 tcp 연결이 해제되며 연결을 위해 사용하였던 리소스의 정리가 발생합니다.
1. 서버와 클라이언트가 TCP 연결이 되어있는 상태에서 클라이언트가 접속을 끊기 위해
CLOSE()함수를 호출하면서 FIN segent를 보내게 되고 클라이언트는 FIN_WAIT_1(응답 기다릴게)상태가 됩니다.
2. 서버는 클라이언트가 접속을 끊는다는것을 알게되고 CLOSE_WAIT 상태(응답줘 기다릴게)로 바꾼후 ACK segment를 전송합니다.
3. ACK segment를 받은 클라이언트는 FIN_WAIT2로 변환되고 이때 서버는 CLOSE()함수를 호출하고 FIN segment를 클라이언트에게 보냅니다.
4. 서버도 연결을 닫았다는 신호를 클라이언트가 수신하면 ACK segment를 보낸 후 TIME_WAIT 상태로 전환됩니다.
5. 이후 모든것이 끝나면 CLOSED 상태로 변환됩니다.
철수가 클라이언트 영희가 서버라고 가정하고 카톡을 한다면?
철수: 야 우리 헤어지자(FIN)
영희: 이놈이 나랑 헤어진다고? 진짜 헤어질거지?(ACK) 생각해보니 자존심 상하네 헤어지자(FIN)
철수: 잘지내(ACK)
[TCP 커플 헤어짐]
2층- 인터넷(Internet)계층
인터넷 계층은 패킷의 인터넷 주소를 결정하고 경로를 배정하는 역할을 합니다.
관련된 프로토콜에는 IP(Internet Protocol), IP를 MAC으로 변환하는 ARP(Address Resolution Protocol), IP 패킷을 전달하는 동안 발생한 오류를 보고하는 ICMP(Internet Control Message Protocol)등이 있습니다.
인터넷은 Inter Connected Network에서 만들어진 합성어로, TCP/IP를 통해 연결된 모든 네트워크의 집합체 입니다.
IP 주소에는 32비트 체계인 IPv4와 128비트 체계인 IPv6가 있습니다.
IPv4는 최대 2^16-1(65,535바이트)로 이루어져 있으며, 5개의 클래스로 나눠집니다.
유니캐스트, 브로드캐스트, 멀티캐스트를 지원합니다.
IPv6는 IPv4의 주소 부족 문제를 해결하기 위해 만들어졌으며, 유니캐스트, 애니캐스트, 멀티캐스트를 지원합니다.
1층- 네트워크 인터페이스(Network Interface)계층
네트워크 인터페이스 계층은 운영체제의 네트워크 카드와 디바이스 드라이버 등과 같이 하드웨어적인 요소와 관련된 모든 것을 지원하는 계층입니다. 상위 계층(IP)에서 패킷이 도착하면 헤더에 프리앰블(Preamble)과 CRC(Cyclic Redundancy Check)를 추가합니다.
송신 측 단말기는 인터넷 계층으로부터 전달받은 패킷에 물리적 주소(MAC) 정보를 가지는 헤더를 추가하여 프레임을 만들어 전달합니다.
관련 프로토콜에는 이더넷(Ethernet), 802.11x, MAC/LLC, PPP 등이 있습니다.
⏳ 정리하며
OSI 와 TCP/IP 모델은 컴퓨터 네트워크를 이해하기위한 개념적인 모델이며 네트워크 통신을 이해하고 설명하기 위해 사용된다는것을 알았다.
계층마다 어떠한 차이점이 있는지 실제로 전체를 만드는 경험을 하긴 힘들겠지만 좋은 공부가 되었고 정의만 간단하게 하려했으나 TCP 연결지향에서의 3,4 핸드 쉐이킹을 좀더 탐구해보고 싶어 공부하면서 최대한 이해가 쉽게 비유도 해보았다.
TCP연결에서 연결 할 때보다 연결을 종료 할 때 더 예기치 못한 상황들이 일어나게 되는데 다양한 상황에 따른 연결의 종료를 적절하게 처리하지 못하면, FIN_WAIT_1, 2, CLOSE_WAIT 상태로 남아 기다리는 상황이 올 수 있다.
CLOSE_WAIT상태(statement)가 많아지게 되면, Hang이 걸려 더이상 연결을 하지 못하는 경우가 생기기도 합니다.
따라서 개발시 여러 상황에 따라 close()처리를 잘해줘야 합니다.
FIN_WAIT_1 상태의 경우 상대방측에서 ACK를 받지 못한 상태로 기다리고 있는 것인데 네트워크 및 방화벽의 문제일 수 있다고 합니다
이러한 상태는 일정 시간이 지나면 Time Out이 되어 자동으로 Closed 하게 됩니다.
FIN_WAIT_2 상태의 경우 클라이언트가 서버에 종료를 요청한 후 서버에서 ACK를 받았지만 서버에서 종료를 완료했다는 FIN을 받지 못하고 기다리고 있는 상태입니다. 이상태는 양방향 2번 통신이 이루어졌기 때문에 네트워크 문제는 아닌 것으로 판단되며, 서버측에서 CLOSE를 처리 못하는 경우일 수 있습니다. FIN_WAIT_1 과 마찬가지로 일정시간 후 Time Out 됩니다.
어떠한 이유에서 1,2 상태인 연결이 많이 남아있다면 문제가 발생할 수 있습니다.
물론 시간이 지나 Time Out이 되면 연길이 자동으로 종료되긴 하겠지만, 이 Time Out이 길어서 많은 수의 소켓이 늘어나게 된다면, 메모리 부족으로 소켓을 오픈하지 못하는 경우가 발생합니다.
이러한 경우에는 네트워크나 방화벽 또는 어플리케이션에서 close()처리 등에 대한 문제등으로 발생할 수 있으며, 원인을 찾기 힘들다고 합니다.
마치며 좀 더 세세한 공부가 필요하다고 느꼈습니다.
부족하지만 긴 글 읽어주셔서 감사합니다.
언제든 틀리거나 고칠점이 있으면 피드백 거침없이 부탁드리며 마무리 하겠습니다.