OSI7 계층은 인터넷 환경에서 통신하기 위해, 네트워킹에 대한 표준을 7계층으로 나눈것입니다.
크게 7계층이 있는데요. 물리계층, 데이터링크 계층, 네트워크 계층, 전송계층, 세션계층, 표현계층, 응용계층이 있습니다.계층을 나눈 이유: 통신이 일어나는 과정이 단계별로 파악되어 특정한 곳에 이상이 생겼을 때 그 단계의 에러만 고칠 수 있다. 또한 각 계층에 대한 캡슐화, 은닉의 목표도 있다.
네트워크에서 통신이 일어나는 과정
1. 물리 Physical Layer : 통신 케이블로 데이터를 전송만!!! 통신 단위는 비트. 1,0, 전기적 신호로는 on/off 통신케이블의 종류로는 리피터와 허브가 있다.
2. 데이터 링크 Data-Link Layer : 정보의 전달을 수행, 맥주소를 가지고 통신(브리지, 스위치), 전송되는 단위는 프레임. 신뢰성 있는 전송을 보장하기 위한 계층으로 CRC기반의 오류제어와 흐름제어가 필요하다. 물리 계층에서 발생할 수 있는 오류를 찾아 내고, 수정하는데 필요한 기능적, 절차적 수단을 제공한다.
3. 네트워크 Network Layer : 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능(라우팅), 프로토콜의 종류도 다양하고, 라우팅하는 기술도 다양하다. ICMP, ARP, IP → 주소부여(IP), 경로설정(Route), 패킷 생성
4. 전송 Transport Layer : 사용자들이 신뢰성있는 데이터를 주고 받을 수 있게 해주며, 패킷들의 전송이 유효한 지 확인하고 전송 실패한 패킷들을 다시 전송한다. TCP, UDP → 패킷 전송
5. 세션 Session Layer : 데이터가 통신하기 위한 논리적인 연결, 동시송수신방식(duplex), 반이중방식(half-duplex), 전이중방식(full-duplex)의 통신과 함께 체크포인팅과 유휴, 종료, 다시 시작 과정들을 수행, 이계층은 TCP/IP 세션을 만들고 없애는 책임을 진다.
6. 표현 Presentation Layer : 데이터 표현이 상이한 응용 프로세스의 독립성을 제공하고 암호화한다.
7. 응용 Application Layer : 응용 프로세스와 직접 관여하여 일반적인 응용 서비스를 수행한다.
라우터는, 다양한 네트워크를 연결하는 장치로 IP주소가 사용되고 네트워크 계층에 속합니다.
스위치는, 다양한 장치를 동시에 연결하는 장치로 MAC 주소가 사용되고 데이터 링크 계층에 속합니다.라우터는 목적지가 불명확한 데이터가 들어오면 데이터를 폐기하지만,
스위치는 브로드캐스팅을 한다는 차이점도 있습니다.
라우터는 주로 LAN과 WAN을 연결(layer3)하는데 많이 사용되며,
게이트웨이는 프로토콜이 다른 네트워크를 연결(layer4)할 때 주로 사용합니다.
요즘에는 라우터와 게이트웨이 기능이 같이 있는 장비를 많이 사용하는 추세입니다.
이종 프로토콜 및 네트워크 간에 통신을 가능하게 하며 다른 네트워크로 들어가는 문 역할을 하는 네트워크 포인트입니다.
TCP/IP 프로토콜은 '인터넷 기반의 효율적인 데이터 전송'을 위한 프로토콜의 모음입니다.
가장 상위부터 '응용계층', '전송계층', '인터넷 계층', '네트워크 액세스 계층' 이렇게 4개의 계층으로 나누어집니다.
가장 상위의 '응용계층'은 HTTP, FTP 를 예로 들 수 있고, TCP/UDP기반의 응용프로그램을 구현할 때 사용합니다.
바로 그 아래의 '전송계층'은 TCP, UDP를 예로 들수 있고, 통신 노드 간 연결을 제어하고 데이터 전송을 담당합니다.
그 아래의 '인터넷 계층'은 통신 노드 간 IP 패킷을 전송하는 것과 라우팅 하는 기능을 담당합니다. 가장 아래의 '네트워크 액세스 계층'은 네트워크의 하드웨어를 제어를 담당합니다.
TCP는 신뢰성 있는 통신을 위해 사용하는 프로토콜로, 높은 신뢰성을 보장하지만, UDP보다는 속도가 느립니다. 3way/4way handshake로 서버와 클라이언트가 1:1로 통신을 하며, 흐름제어와 혼잡제어가 이루어지게 됩니다.
UDP는 비연결형 프로토콜로, 손상된 데이터에 대해서 재전송하지 않습니다. 대신에 신뢰성이 낮지만, TCP 보다 속도가 빨라서 스트리밍 같은 서비스에 주로 사용이 되며, 1:1, 1:N, N:M으로 연결이 가능합니다.
TCP/IP는 실제 인터넷 통신을 반영하기에 현실적이며, 인터넷 개발 이후 지속적으로 표준화되어 신뢰성이 우수합니다.
반면, OSI 모델은 계층을 정확히 구분한 표준이긴 하나 실질적으로 적용되는 예시가 적어 신뢰성이 보장되지 못한다.
TCP 서버 구현을 위한 기본적인 함수의 호출 순서,
1. socket() : 소켓 생성
2. bind() : 소켓에 주소 할당
3. listen() : 연결요청 대기상태. 서버의 listen 이후 클라이언트가 connect()를 할 수 있다.
-> 클라이언트의 연결요청도, 인터넷을 통해서 들어오는 일종의 데이터 이므로 당연히 소켓이 있어야 받을 수 있다. 서버 소켓의 역할을 연결 요청을 받아들이는 것이라고 할 수 있다.
- accept()
- listen 호출 이후 클라이언트가 연결 요청이 들어오면, 들어온 순서대로 연결요청을 수락해야 한다.
- 연결 요청을 수락한다는 것은 데이터를 주고 받을 수 있는 상태가 됨을 의미한다.
- 연결 요청을 받아들이는 소켓이, 연결 대기 중인 연결요청 중 먼저의 것을 가져와서 데이터를 송수신하기 위한 새로운 소켓을 만들고 이의 파일 디스크립터를 반환한다.
- 이 때 연결요청을 한 클라 소켓과 연결까지 끝낸 상태로 fd를 반환한다.
- 클라이언트가 connect() 이전에 accept()가 호출되면 queue는 비어있기 때문에 block이 걸리고 연결 요청을 기다린다.
- read() / write()
- close()
클라이언트의 기본적인 함수의 호출 순서,
1. socket()
- connect()
- 연결 요청을 하면 연결 요청이 접수되거나 중단된다.
- 연결 요청이 접수된 상태는 accept()가 호출된 상태가 아니라 queue에 연결 요청이 저장된 상태이다.
- 따라서 connect() 함수가 반환되어도 바로 서비스가 실행되지는 않을 수 있다.
- 클라이언트 소켓은 bind()를 호출하지 않아도 connect()를 호출할 때 커널에 의해서 호스트에 할당된 IP와 임의의 port가 할당된다.
- read() / write()
- close()
TCP 3 Way Handshake는, TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에
먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미합니다.
절차는,
Client > Server : TCP SYN
Server > Client : TCP SYN, ACK
Client > Server : TCP ACK
여기서 SYN은 'synchronize sequence numbers', 그리고 ACK는'acknowledgment' 의 약자입니다.
3-Way handshake는 TCP의 연결을 초기화 할 때 사용한다면,
4-Way handshake는 세션을 종료하기 위해 수행되는 절차입니다.
[STEP 1]
A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다.
이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태, B서버는 Wait for Client 상태이다.
[STEP 2]
B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고
A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.
[STEP 3]
A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다.
이때의 B서버 상태가 ESTABLISHED 이다.
위와 같은 방식으로 통신하는것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식이다.
[STEP 1]
클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다. 이때 A클라이언트는 FIN-WAIT 상태가 된다.
[STEP 2]
B서버는 FIN플래그를 받고, 일단 확인메시지 ACK 보내고 자신의 통신이 끝날때까지 기다리는데 이 상태가
B서버의 CLOSE_WAIT상태다.
[STEP 3]
연결을 종료할 준비가 되면, 연결해지를 위한 준비가 되었음을 알리기 위해 클라이언트에게 FIN플래그를 전송한다. 이때 B서버의 상태는 LAST-ACK이다.
[STEP 4]
클라이언트는 해지준비가 되었다는 ACK를 확인했다는 메시지를 보낸다.
A클라이언트의 상태가 FIN-WAIT ->TIME-WAIT 으로 변경된다.
그런데 만약 "Server에서 FIN을 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN패킷보다 늦게 도착하는 상황"이 발생한다면 어떻게 될까요?
Client에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 Drop되고 데이터는 유실될 것입니다.
A클라이언트는 이러한 현상에 대비하여 Client는 Server로부터 FIN을 수신하더라도 일정시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치게 되는데 이 과정을 "TIME_WAIT" 라고 합니다. 일정시간이 지나면, 세션을 만료하고 연결을 종료시키며, "CLOSE" 상태로 변화합니다.
TCP에서는 연결 할 때보다 연결을 종료 할 때 더 예기치 못한 상황들이 일어나게 되는데, 다양한 상황에 따른 연결의 종료를 적절하게 처리하지 못하면, FIN_WAIT_1, FIN_WAIT_2, CLOSE_WAIT 상태로 남아 계속 기다리는 상황이 올 수 있습니다.
- CLOSE_WAIT 상태 : 어플리케이션에서 close()를 적절하게 처리해주지 못하면, TCP 포트는 CLOSE_WAIT 상태로 계속 기다리게 됩니다. 이렇게 CLOSE_WAIT 상태가 statement에 많아지게 되면, Hang 이 걸려 더이상 연결을 하지 못하는 경우가 생기기도 합니다. 따라서 어플리케이션 개발시 여러 상황에 따라 close() 처리를 잘 해줘야 합니다.
- FIN_WAIT_1 상태 : FIN_WAIT_1 상태라는 것은 상대방측에 커넥션 종료 요청을 했는데, ACK를 받지 못한 상태로 기다리고 있는 것 입니다. 이것은 서버를 찾을 수 없는 것으로, 네트워크 및 방화벽의 문제일 수 있습니다.(FIN_WAIT_1 의 상태는 일정 시간이 지나 Time Out이 되면 자동으로 Closed됩니다.)
- FIN_WAIT_2 상태 : FIN_WAIT_2 상태는 클라이언트가 서버에 종료를 요청한 후 서버에서 요청을 접수했다고 ACK를 받았지만, 서버에서 종료를 완료했다는 FIN 을 받지 못하고 기다리고 있는 상태입니다. 이상태는 양방의 두번의 통신이 이루어졌기 때문에 네트워크의 문제는 아닌 것으로 판단되며,(FIN 을 보내는 순간에 순단이 있어 못받은 것일 수도 있다.) 서버측에서 CLOSE를 처리하지 못하는 경우일 수도 있다. FIN_WAIT_2 역시 일정시간 후 Time Out이 되면 스스로 Closed 하게 된다.
- 어떠한 이유에서 FIN_WAIT_1과 FIN_WAIT_2 상태인 연결이 많이 남아있다면, 문제가 발생할 수 있습니다. 물론 일정 시간이 지나 Time Out이 되면 연결이 자동으로 종료되긴 하지만, 이 Time Out이 길어서 많은 수의 소켓이 늘어만 난다면, 메모리 부족으로 더 이상 소켓을 오픈하지 못하는 경우가 발생합니다.
(이 경우는 네트워크나 방화벽 또는 어플리케이션에서 close() 처리 등에 대한 문제등으로 발생할 수 있으며, 원인을 찾기가 쉽지 않습니다.)
IP는 Internet Protocol의 약자로, 인터넷 망을 통해 패킷을 전달하는 프로토콜입니다.비연결성과 비신뢰성 이라는 특징이 있습니다.
비연결성은, 패킷을 보내는 길을 정하지 않는 것이고, 비신뢰성은 패킷의 완전한 전달을 보장하지 않는 것 입니다.
IP address - 호스트나 라우터 장비의 인터페이스에 할당된 32 bit 의 주소입니다. (현재 많이 사용하는 IPv4 기준. IPv6는 128bit입니다.)
이 주소를 통해서 장치들이 서로를 인식하고 통신할 수 있습니다.
32 bit의 주소 공간을 가지고 있고 예시와 같이 표기합니다.
ex) 192.168.107.11
MAC 주소는 데이터 링크 계층(2계층)에서 사용하는 네트워크 인터페이스에 (보통 NIC == Network Interface card) 할당된 고유 식별 주소, 고유 식별자이고, 물리 주소나 하드웨어 주소(Hardware address) 라고도 불립니다.
MAC 주소는 네트워크 인터페이스 컨트롤러(NIC 카드)를 만든 회사에서 할당하여 하드웨어에 저장됩니다.
이는 다른 MAC 주소와 겹치지 않는 고유의 주소를 할당하고, 48비트로 구성되어있습니다.
ex) D1:F2:FK:CC:12:34
ip 주소는, 보낸 주소에서 부터 도착지 주소까지의 경로를 찾기 위해 필요한 주소입니다.
mac 주소는, 한 주소 내에서 다양한 기기들이 있을 때, 해당 기기들이 각각 어떤 기기들인지 식별하기 위하여 필요한 주소입니다.
ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜입니다. ICMP는 해당 호스트가 없거나, 해당 포트에 대기중에 서버 프로그램이 없는 등의 에러 상황이 발생할 경우 IP헤더에 기록되어 있는 출발지 호스트로 이러한 에러에 대한 상황을 보내주는 역할을 수행하게 됩니다.
에러 메세지로는 대표적으로 2가지가 있습니다.
- Destination Unreachable : 목적지에 도달하지 못함
- Time Exceeded : 시간이 오래 걸려 목적지에 도달하지 못함
그 밖에도 Redirect 등의 에러메세지가 있습니다.
멀티캐스팅 데이터의 수신을 위해서 사용되며, 호스트(컴퓨터)가 멀티캐스트 그룹 구성원을 인접한 라우터로에게 알리는 프로토콜 입니다.
IP 주소(논리주소) -> MAC 주소(물리주소, LAN카드 주소)
ARP 프로토콜은, IP Address를 이용하여 물리적인 네트워크 주소(MAC주소)를 얻는데 사용되며,
ARP를 이용하여, IP Address가 중복되어 사용되는지 찾을 수 있습니다.
DNS는 도메인 주소를 IP 주소로 변환해주는 시스템입니다. DNS는 다음과 같은 순서로 작동하게 되는데요
URL을 입력하면, ISP가 관리하는 DNS 해석기의 요청을 라우팅 시킵니다. 그 다음에 DNS 해석기가 루트서버에 top-level의 서버 주소를 요청하구요, 그 이후 Top-level에서 second-level 그리고 second-level에서 서버 sub DNS server 이렇게 해서 최종적으로 IP 주소를 얻게 됩니다.
- 웹 브라우저에 www.naver.com을 입력하면 먼저 Local DNS에게 "www.naver.com"이라는 hostname"에 대한 IP 주소를 질의하여 Local DNS에 없으면 다른 DNS name 서버 정보를 받음(Root DNS 정보 전달 받음)
- Root DNS 서버에 "www.naver.com" 질의
- Root DNS 서버로 부터 "com 도메인"을 관리하는 TLD (Top-Level Domain) 이름 서버 정보 전달 받음
- TLD에 "www.naver.com" 질의
- TLD에서 "name.com" 관리하는 DNS 정보 전달
- "naver.com" 도메인을 관리하는 DNS 서버에 "www.naver.com" 호스트네임에 대한 IP 주소 질의
- Local DNS 서버에게 "응! www.naver.com에 대한 IP 주소는 222.122.195.6 응답
- Local DNS는 www.naver.com에 대한 IP 주소를 캐싱을 하고 IP 주소 정보 전달
라운드 로빈 스케줄링(Round Robin Scheduling, RR)은 시분할 시스템을 위해 설계된 선점형 스케줄링의 하나로서, 프로세스들 사이에 우선순위를 두지 않고, 순서대로 시간단위(Time Quantum/Slice)로 CPU를 할당하는 방식의 CPU 스케줄링 알고리즘입니다.
문맥 전환의 오버헤드가 큰 반면, 응답시간이 짧아지는 장점이 있어 실시간 시스템에 유리하고, 할당되는 시간이 클 경우 비선점 FIFO기법과 같아지게 됩니다.
프록시 서버란,
클라이언트가 자신을 거쳐 다른 네트워크에 접속할 수 있도록 중간에서 대리해주는 서버를 말합니다. 즉, 프록시 서버는 서버와 클라이언트 사이에서 요청과 응답을 처리하는 역할을 합니다.프록시 서버의 사용 목적
- 캐시데이터를 사용하기 위함이다. 프록시 서버중 일부는 프록시 서버에 요청된 내용을 캐시를 사용해 저장해둔다. 그러면 캐시에 저장되어 있는 내용에 대한 재요청은 서버에 따로 접속할 필요가 없이 저장된 내용을 그래도 돌려주면 되기 때문에 전송 시간을 절약할 수 있고 외부 트래픽을 줄임으로써 네트워크 병목현상도 방지할 수 있다.
- 보안목적으로 많이 사용된다. 프록시 서버가 중간에 경유하게 되면, IP를 숨기는 것이 가능하기 때문이다. 또한 프록시 서버를 방화벽으로 사용하기도 한다.
- 접속우회에 사용된다. 간혹 접속이 제한되는 사이트가 있다. IP를 검사하여 한국에서의 접속임을 감지하기 때문인데 이런 경우 프록시 서버를 사용하면 접속을 다른 나라로 우회할 수 있게 된다.
로드밸런서는 서버의 부하를 분산시켜주는 시스템입니다. 크게 L4 로드밸런서와, L7 로드밸런서가 있는데요
L4 로드밸런서는, 4계층 이하의 정보를 가지고 로드를 분산해줍니다. 특히, MAC주소, IP주소, 포트정보를 가지고 트래픽을 분산해줍니다.
L7 로드밸런서는, 응용 계층의 정보를 가지고 로드를 분산 시켜줍니다. 패킷 내용을 확인하고 분산해서 DDos 같은 비정상적인 트래픽도 필터링할 수 있습니다.