본문 바로가기

프로그래밍/서버

컴퓨터 네트워크 2

계층 3 : 네트워크 계층

 : 광역 통신망(WAN)에서 통신을 가능하게 한다

WAN의 모든 단말기는 OSI모델의 계층 3에서 요구하는 형식의 주소를 가진다

 

직접 데이터를 건네는 것이 아닌, 계층적으로 데이터를 건네주는 방식이다

어떤 데이터가 단말기에서 스위치로 갔는데 그 데이터를 스위치가 직접 건네줄 수 없는 곳에 있으면, 이를 취급할 수 있는 곳으로 데이터를 보내야 한다

이 역할을 하는 네트워크 기기를 라우터(Router)라고 한다

 

라우터

 : 서로 다른 LAN 사이에 컴퓨터 통신을 할 수 있게 하는 장비이다

 

인터넷 프로토콜(Internet Protocol, IP)

어떤 데이터 X를 보내려고 하면 IP에 의해 IP 패킷(packet) 형태로 포장된다

 

단말기 A -> 단말기 A의 LAN -> 라우터 -> 단말기 B의 LAN -> 단말기 B

 

스트림(Stream)

 : 데이터의 흐름이다.

 두 단말기를 연결한 후 그 연결을 끊기 전까지 한쪽에서 다른 한쪽으로 연결된 데이터 흐름 하나.

 

헤더를 붙이는 방식

 : 보낼 데이터 크기를 먼저 보낸다

 첫 2바이트에는 보낼 데이터의 크기를 담는다

 이어서 보낼 데이터를 담는다

 

구분자 방식

 : 데이터 시작이나 끝을 알리는 특정 기호를 추가한다

보낼 데이터를 담는다

이어서 구분자를 담는다

구분자를 제외하고 보낼 데이터를 구분자와 같은 값이 없어야 한다

 

메세지 형식

 : 각 데이터가 정확히 구별되는 것

 

네트워크 게임에서는 특정 시점에서 사건을 알리는 경우가 많기 때문에 메세지 형식의 데이터 송수신이 보편적이다

 

IP패킷에는 주고받는 데이터, 페이로드의 크기, 송신자 주소, 수신자 주소, 체크섬(checksum) 등이 들어있다

 

1. 수신자 주소

 : 수신 측 단말기까지 전달할 때 라우터에서 필요한 정보

 

2. 송신자 주소

 : 수신측 단말기까지 도착한 후 수신자 측에서 송신자를 식별하는 용도로 사용한다

 

IP 패킷의 크기는 보통 1300바이트, 작게는 600바이트부터 크게는 9000바이트까지 이른다

 

단편화(Fragmentation)

매우 긴 스트림을 송신할 때 IP 패킷의 크기 제한에 맞추어 여러 조각을 내는 것

각 조각은 IP 패킷 하나하나가 되어 받는 쪽에 송신한다

 

받는 쪽에서는 이 조각들을 받아 조립한 후 스트림 형태로 복원한다

 

버전 4 주소 형식(IPv4)

 : 1바이트 숫자 4개 조합, 32비트이다

각 1바이트 숫자 사이마다 마침표(.)를 찍어서 표현한다

 

특정 범위 안에서 여러 기관에 분배한 후, 다시 그 안에서 여러 단계에 걸쳐 분배되는 방식

실제 주소로 사용할 수 없는 예약 범위도 있다

실제 사용 가능한 주소 개수는 더 적다

 

버전 6 주소 형식(IPv6)

 : 2바이트 숫자 8개의 조합, 16바이트이다

 

IPv4 : 1바이트 숫자 4개 조합

IPv6 : 2바이트 숫자 8개 조합

서로 호환되지 않는다

 

포트(port)

 : 한 IP 주소 안에서도 누가 주고받는 것인지 식별하는 역할, 2바이트 정수이다

 

끝점(endpoint)

 : IP 주소와 포트를 한데 묶은 것. <IP주소:포트> 형식이다

 

호스트 이름(host name)

 : 입력하는 영어 단어 형식의 기기 주소

영어 문장 형식으로 입력하면 이를 IP 주소로 변환한다

 

도메인 이름 서버(DNS Server)에서 호스트 이름을 입력하면 컴퓨터는 이를 IP 주소로 변환한다

 

스위치나 라우터는 데이터를 받으면 데이터 안의 내용 중 헤더를 먼저 읽는다

그리고 데이터를 어디로 전달해야 할지 판단하고자 기기 자체에 내장된 메모리를 액세스한다

 

패킷 드롭(drop)

 : 네트워크 기기가 처리하지 못한 패킷을 버리는 것

결과적으로 패킷 유실(loss)이 일어난다

 

가정용 라우터는 처리할 수 있는 양 이상의 패킷이 도착하면 버리지 않고 메모리에 누적시키는 경우가 있다

장시간 지속되면 가정용 라우터가 멈춰 버리거나 재부팅된다

 

라우터에 과부하가 걸리면 송신자가 보낸 패킷 중 일부는 수신자에게 전달되지 못하는 패킷 유실 현상이 발생한다.

라우터 때문만이 아니라, 데이터가 오가는 선로에 문제가 있을 수도 있다

 

오류 검사는 체크섬 검사로 확인한다

발견되면 데이터 수정을 시도한다

 

네트워크 기기에 데이터가 가는 동안 잡음이 섞이면 프레임이나 패킷은 그냥 버려진다

 

정리하면

1. 네트워크 기기가 처리할 수 있는 한계를 넘어가면 패킷 유실이 발생할 수 있다

2. 회선 신호가 약하거나 잡음이 섞이면 패킷 유실이 발생할 수 있다

 

전송 속도

 : 두 기기 간에 초당 전송될 수 있는 최대 데이터양

보통 초당 비트 수(bit per second, bps) 또는 바이트 수(Bytes per second, B/s)로 표현한다

 

선로의 종류와 품질, 두 기기의 소프트웨어와 하드웨어 종류가 영향을 준다

 

전송 지연 시간(latency)

 : 레이턴시는 두 기기 간에 데이터를 최소량 전송할 때 걸리는 시간, 주로 밀리초(ms)를 쓴다

매체의 종류와 품질, 송신자-수신자 사이의 라우터 처리 속도가 영향을 준다

주로 사용되는 매체는 구리 전선, 광섬유, 무선이다

 

정리

 

1. 전송 속도(스루풋)

 : 전송될 수 있는 데이터의 단위 시간당 총량을 의미한다.

 회선의 종류가 좋을수록, 네트워크 장비의 처리 속도가 빠를수록 향상된다

 

2. 패킷 유실률

 : 전송되는 데이터가 중간에 버려지는 비율

 회선 품질이 좋을수록, 경로에 있는 라우터 개수가 적을수록, 라우터의 처리 성능이 좋을수록 낮아진다

 

3. 레이턴시

 : 전송되는 데이터가 목적지에 도착하는데 걸리는 시간이다

 회선 길이가 길수록 높고, 경로에 라우터 개수가 많을수록 높다

 

UDP(User Datagram Protocol)

 : 사용자가 정의한 데이터그램을 상대방에게 보낼 수 있게 하는 통신 규약이다

정해진 UDP 포트를 할당해야 하고 보내는 쪽에서는 받을 쪽의 IP 주소 혹은 호스트 이름을 알아야 한다

 

데이터그램 내용이 훼손되지 않는다

 

소켓(Socket)

 : 단말기 사이에 통신할 수 있게 OS에서 제공하는 자원이다

 

UDP로 데이터를 주고받으려면 소켓을 생성해야 한다

대부분 int32타입이다

 

UDP 소켓을 이용해서 데이터를 보내는 것뿐만 아니라 받는 것도 가능하다

 

다대다 통신이 가능하다

 

UDP는 사용법이 간단한 반면, 데이터 유실 또는 순서 뒤바뀜 같은 문제가 생긴다는 단점이 있다

 

TCP(Transmission Control Protocol)

 : 보내는 쪽 데이터가 받는 쪽에서 완전히 동일함을 보장해 주는 프로토콜

 데이터를 주고받기 전에 연결이라는 과정을 먼저 해야한다. 

연결지향형(Connection Oriented)라고 한다. 연결은 일대일만 가능하다

 

보낸 데이터가 받는 쪽에서 정확히 모두 도착한다는 것을 보장한다

 

TCP는 스트림 형태이다

TCP 자체가 갖고 있는 흐름 제어 기능(Data Flow Control)때문에 데이터가 상대방에게 정확히 전송된다

 

보낼 스트림 데이터는 세그먼트(segment)라는 IP 패킷에 넣을 수 있는 크기의 단위로 쪼개진다

IP 패킷 안에 세그먼트를 넣어서 수신자에게 전송된다

수신자는 IP 패킷을 받으면 여기서 세그먼트를 꺼내 받은 세그먼트 응답을 송신자에게 반송한다

ack 또는 acknowledge라고 한다

 

보낸 쪽에서는 일정 시간 안에 세그먼트에 대한 ack가 회신되지 않으면, 상대방이 받았다는 응답이 올 떄까지 다시 세그먼트를 보낸다

 

패킷 유실이 발생하면

 

UDP에서는 데이터그램 자체가 유실된다

 

TCP에서는 유실된 패킷에 대한 ack가 도착하지 않는다. ack가 오지 않으면 다시 패킷을 보낸다.

수신 측에서는 도착하지 않은 패킷이 있으면 다른 패킷이 다 도착하더라도 데이터 스트림을 조립하지 못한다

 

UDP에서는 데이터그램이 유실되고

TCP에서는 중간에 지연 시간이 발생한다

 

CRC (Cycle Redundancy Check)

 : 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식

'프로그래밍 > 서버' 카테고리의 다른 글

소켓 프로그래밍 3  (0) 2019.09.27
소켓 프로그래밍 2  (0) 2019.09.25
소켓 프로그래밍 1  (0) 2019.09.23
컴퓨터 네트워크 1  (0) 2019.09.19
멀티스레딩  (0) 2019.09.14