클라이언트 개발자들은 직접 서버와 네트워크를 다루지는 않더라도 컴퓨터 네트워크의 특징에 대해서는 알고 있어야 한다. 본 강연은 클라이언트 개발자들이 반드시 알아야 하는 컴퓨터 네트워크 관련 용어와 특징을 소개한다. 아울러 스마트폰 무선 네트워크 관련해서 주안점도 다룬다.
3. LAN
• 지역 통신망(Local Area Network)
• 가까운 지역을 묶는 컴퓨터 네트워크
• 정의
– 한정된 지역에서 컴퓨터를 기본으로 하는 여러 가
지 전자기기 사이의 자유로운 정보교환
– 구축한 사용자가 직접 관리, 운영함
– 다른 제조사간의 기기간에도 서로 통신 가능
• 스위치
– LAN의 컴퓨터를 연결해주는 중앙 컴퓨터
4. WAN
• 광역 통신망 (Wide Area Network)
– 서로 다른 LAN간의 컴퓨터 네트워크
– 서로 다른 건물 이상의 넓은 범위간의 연결
• 라우터
– 서로 다른 LAN간의 컴퓨터 통신이 가능하게 해
주는 장비
5. 인터넷
• 특정 스펙(OSI Layer-3)만
맞춰주면 연결 가능한 컴
퓨터와 네트워크 장비의
그물망
• 즉, 서로 다른 종류의, 많은
스위치와 라우터의 그물망
6. 딱 이것만 기억하자
• 인터넷의 정체
– 라우터를 사이에 두고 컴퓨터들끼리 연결되어 있는 거대한 컴퓨터 네트워크
8. 스트림
• 연결을 맺은 후 끊을 때까지 쭈욱 가는 1개의 데
이터 흐름
• 파일의 끝에 도달하기 직전까지는 원하는 크기를
읽음
• 그러나 네트워크에서는
– 보낸 개수 != 받는 개수
– 보낸 데이터의 시작 != 받는 데이터의 시작
– 보낸 데이터의 끝 != 받는 데이터의 끝
• 일반적 앱에서 가장 많이 쓰이는 유형
PrintFileContents()
{
fp = OpenFile("a.txt");
while(!fp.IsEOF())
{
data = fp.ReadStream(100);
Print(data);
}
}
9. 메시지
• 윈도 메시지 생각하시면 됩니다.
– 보낸 개수 = 받는 개수
– 보낸 데이터의 시작 = 받는 데이터의 시작
– 보낸 데이터의 끝 = 받는 데이터의 끝
• 게임에서는 이것을 가장 많이 사용함
• 길이 제한이 관대함
Fire Bullet
Position
Direction
Bullet Type
10. 패킷
• 인터넷 표준에서 주고받는 데이터 단위
• 사용자가 별로 다루는 영역이 아님
• 사용자가 주고받는 스트림이나 메시지는
패킷이라는 것으로 쪼개지고 조립되는 과
정이 반복됨
• 길이 제한이 라우터마다 다양 (600~9000
바이트, 보통 1300바이트)
11. 딱 이것만 기억하자
• 패킷과 메시지는 사실 서로 다르다
• 스트림은 중간에 잘리거나 뭉쳐질 수 있다
12. IP address (약칭해서 IP)
• Internet Protocol Address
• 컴퓨터 네트워크에서 장치들이 서로를
인식하고 통신을 하기 위해서 사용하는
특수한 번호
• 컴퓨터,스위치,라우터 각각이 가짐
• 여러분의 스마트폰은 몇 개의 IP를 갖고
있을까요?
• 시연
– c:/>ipconfig
IPv4 주소
IPv6 주소
13. Port
• 컴퓨터 한 대에는 여러 개의 네트워킹 프로
그램이 실행됨
• 실행중인 프로그램(프로세스)는 여러 다른
컴퓨터와 통신하고 있을 수도 있음
• 그것들을 식별하고자.
• 시연
– c:/>netstat -ano
11.22.33.44
Chat.exe
Game.exe
Browser.ex
e
Port 4
Port 5
Port 6
Port 7
Port 8
Port 9
14. Host name
• 사람이 읽을 수 있는 컴퓨터의 이름
• 컴퓨터는 host name을 IP address로 바꾸어 사용
• 예: www.naver.com, mygame.mypublisher.com
• 시연
– C:/>ping www.facebook.com
15. 딱 이것만 기억하자
• 우리가 여지껏 IP라고 부른 것이 알고 보니 host name
17. • 아날로그 TV에서는 잡음이 섞이면?
• 디지털 TV에서는 잡음이 섞이면?
디지털과 아날로그의 무지함의 예
18. • 스위치, 라우터에 잡음이 섞이면
– 도착한 패킷의 내용이 훼손됨
– 체크섬 실패
– 따라서 버려짐
19. 스위치와 라우터의 정체
• 스위치와 라우터도 결국에는 컴퓨터
• 스위치, 라우터에 과부하(가령 메모리나 CPU)가 걸리면
– 자기가 살기 위해 패킷을 버림
– 간혹 패킷을 계속 자기 메모리에 누적하다 뻗어버리는 기종도 있음
20. 처리량 한계와 레이턴시
• 단말기 사이의 라우터가 많을수록 레이턴시가 길어짐
• 라우터가 과부하가 걸리거나 회선의 거리가 길어도 레이턴시가 길어짐
• 아인슈타인을 이길 수 없음
21. 회선 자체의 처리량
• 1초 동안 얼마나 많은 데이터를 전송할 수 있는가
• 하드웨어의 영역
– 주파수가 높으면 보낼 수 있는 신호의 개수가 증가
– 전압이 높으면 보낼 수 있는 신호의 종류가 증가
– 페이즈가 다양하면 보낼 수 있는 신호의 종류가 증가
– 선의 개수가 많으면 보낼 수 있는 신호의 개수가 증가
– (주의: 잘 모르는 채로 대충 적은 것이므로 위 내용은 틀릴 수 있음)
– 자세한 내용은 컴퓨터네트워크 교과서 앞단에 소개
22. 라우터의 처리량
• 라우터에 각 단자(포트)에 부착된 신호 처리 하드웨어의 처리 속도
• 라우터도 결국 컴퓨터이므로, 그 컴퓨터의 데이터 처리 속도
23. 네트워크의 성능 3대요소
• 전송 속도(처리량 throughput 높을수록 좋음)
– 전송될 수 있는 데이터의 단위 시간당 총량
– 회선의 종류가 좋을수록 향상
– 네트워크 장비의 처리 속도가 빠를수록 향상
• 패킷 드랍율 (낮을수록 좋음)
– 전송되는 데이터가 중간에 버려지는 비율
– 회선의 품질이 좋을수록 낮음
– 경로상의 라우터의 수가 적을수록 낮음
– 라우터의 처리 성능이 좋을수록 낮음
• 레이턴시 (낮을수록 좋음)
– 전송되는 데이터가 목적지에 도착하는데 걸리는 시간
– 회선의 길이가 길수록 높음
– 경로상의 라우터의 수가 많을수록 높음
– 라우터의 처리 성능이 나쁠수록 높음
24. 무선 네트워크에서는
• Wifi 자체의 전파 간섭 회피 기능
– 자체 내장된 전송 딜레이 기능
– 전파 간섭이 많으면 레이턴시와 패킷 드랍이 동시에
발생
25. 컴퓨터 네트워크에서 패킷 보내기
• 마치, 메일을 보내는 것과 같음
• 수신자가 도달 가능한 곳에 있기만 하면, 전송한
패킷은 상대방에게 도달함
• 그것을 하는 대표적인 방법이 UDP 소켓 통신
수신자
IP addr:port
송신자
IP addr:port
26. 딱 이것만 기억합시다
• 레이턴시와 처리량은 서로 별개
• 패킷 드랍률이라는 복병도 있음
27. Socket이란
• 파일 접근을 위해서는 => 핸들을 만든다
• 네트웍 통신을 하기 위해서는 => 소켓을 만든다
• 소켓 = 파일 핸들
int file = open("myfile.txt");
close(socket);
int socket = socket(TCP);
close(file);
28. UDP (user datagram protocol)
• 사용자가 정의한 메시지(데이터그램)을 전송하
는 통신 규약
• IP:port는 다대다 통신 가능 (아예 연결이라는 것
자체가 존재 안함)
• 메시지 단위로 데이터가 전송
– 보내는 쪽이 a,bb,ccc,dddd를 전송할 경우
– 받는 쪽은 반드시 a,bb,ccc,dddd로 받음 (패킷 드랍이
없는 경우)
• 패킷 드랍이 발생하면, 운영체제가 재송신을 해
주는 일이 없으므로, 결국 패킷 드랍으로 이어짐
• 멀티미디어 통신이나 게임 등에서 이 프로토콜을
사용
UDP
socket
UDP
socket
UDP
socket
UDP
socket
29. UDP 통신 예
• UDP 타입의 소켓을 생성하는 함수
호출 (socket)
• 소켓이 사용할 로컬 포트를 지정하
는 함수 호출 (bind)
– 이미 사용중이 아니어야 함
– Any를 지정해서 유휴 포트를 자동 지정
해도 됨
• 데이터를 수신할 대상에게 데이터그
램을 전송하는 함수 호출 (sendTo)
• 데이터를 수신하는 함수를 호출해서
데이터그램을 받기 (recvFrom)
– 이때 송신한 곳의 주소와 포트도 얻음
<단말기 11.22.33.44에서>
main()
{
s = socket(UDP);
s.bind(any_port);
s.sendTo("55.66.77.88:5959","hello");
s.close();
}
<단말기 55.66.77.88에서>
main()
{
s = socket(UDP);
s.bind(5959);
r = s.recvFrom();
print(r.srcAddrPort, r.data);
s.close();
}
<실행 결과>
11.22.33.44:53234 hello
NOTE: 위 예시에서는 송신과 수신이 되기 위한 wait
과정이 생략되어 있음
30. TCP (transmission control protocol)
• 전송 제어 프로토콜
• 연결 지향형 (반드시 논리적 연결을 해야만 통신 가능)
• IP:port는 1대1 연결만 허용
• 보내는 데이터는 반드시 상대방에게 도달함
• 스트림 형태로 데이터가 전송
– 보내는 쪽이 a,bb,ccc,dddd를 전송할 경우
– 받는 쪽은 a,bb,ccc,dddd 뿐만 아니라 abbcccdddd로 받을 수
도 있고 abb,cccd,ddd로 받을 수도 있음
• 패킷 드랍이 발생하면, 운영체제가 알아서 재송신을
통해 반드시 상대에게 스트림이 모두 도착하게 함
• 거의 모든 네트워크 앱은 이 프로토콜을 사용
TCP
socket
TCP
socket
31. TCP 통신 예
• UDP 통신 예와 비슷하지만, 차이점
– TCP 연결을 하는 함수를 호출해서 상대방과
연결 (connect)
– 반대쪽에서는 TCP 연결 받을 수 있게 하고
(listen) 상대방으로 연결이 들어오면 새 TCP
socket을 추가로 생성(accept)
– 1대1 연결이므로 송신시 수신대상 지정 안
하며(send), 수신시 송신대상 얻지 않음
(recv)
<11.22.33.44>
main()
{
s = socket(TCP);
s.bind(any_port);
s.connect("55.66.77.88:5959");
s.send("hello");
s.close();
}
<55.66.77.88>
main()
{
s = socket(TCP);
s.listen(5959);
s2 = s.accept();
r = s2.recv();
print(s2.remoteAddrPort, r);
}
<결과>
11.22.33.44:51409 hello
NOTE: 위 예시에서는 송신과 수신이 되기 위한 wait
과정이 생략되어 있음. 그리고 위 결과는 송신한 내용
이 stream의 특성상 중간에 잘리지 않음을 가정함
32. TCP, UDP 소켓
• 소켓 하나로 송신과 수신을 모두 수행함
– 송신용 소켓, 수신용 소켓 따로 만들지 마세요. 성능 더 나쁨
33. 딱 이것만 기억합시다
• TCP 소켓
– 일대일만 가능
– 패킷 유실을 신경쓸 필요 없음
– 스트림이라 데이터가 쪼개지거나 뭉쳐짐
34. 패킷 드랍이 발생하면
TCP UDP
드랍된 패킷은 재전송을
하기 때문에,
스트림이 시간 지연되어
상대방에게 전송됨
드랍된 패킷은 그냥 무시
되기 때문에,
데이터그램(메시지)가 상
대에게 전송되지 못함
레이턴시 =
기본 레이턴시 +
재송신 타임아웃 x
패킷 드랍율
레이턴시 = 기본 레이턴시
35. TCP와 UDP는 언제 쓰는지
• UDP
– 좀 버려져도 괜찮은 류
– 캐릭터 이동, 기관총 난사, 음성/화상 데이터
• TCP
– 위의 경우 제외하고 모든 경우
• MMORPG 하나의 총 메시지 종류는 약 500여개
– 이들 중 5% 미만이 UDP
– 그러나 이들이 전체 트래픽의 70%를 차지
36. 무선 네트워크에서는
• 높은 패킷 드랍율 (평균 20%. 유선은 평균 5% 미만인데!)
• TCP를 쓰면 핑 스파이크
• 따라서
– 가급적 UDP 사용
– 단, 일부 3G/LTE 기지국에서는 UDP 불가능하므로 TCP도 혼용해야