개인적으로 수업 시간에 매우 열심히 들었던 15단원 네트워크 부분에서 내 눈에 딱 들어오는 부분이 있었다. 그거는 다름이 아닌 내가 요즘 연습하고 있는 스타크래프트 II가 쓰고 있다는 파일 전송 방법이었다. 평상시에 항상 쓰던 TCP방법이라는 다르게 스타크래프트 II는 UDP방법을 사용했다는 소리를 듣고 매우 흥미를 가지고 수업을 들었다. 하지만, 수업 시간에 물론 수업 시간이 짧은 관계로 UDP는 TCP에 비해 자료를 보내기만 하기 때문에 속도가 매우 빠르지만, 불안전하다는 내용을 배웠다. 이러한 자료에 성이 차지 않은 나는 자료를 조금 더 찾아보도록 하였다. (아무래도 스투랑 관련이 있어서 그런지도 모르겠다.ㅋ)
바로 UDP의 내용으로 설명을 하고 싶지만 불행히도 UDP 내용을 설명하기 위해서는 TCP의 내용을 먼저 알아야 되기 때문에 TCP에 대해서 먼저 말하도록 하겠다. 일단 TCP나 UDP는 모두 IP을 기반으로 인터넷 통신을 한다. TCP는 네트워크를 통한 전송 제어 프로토콜로 데이터의 흐름을 관리하고, 데이터가 정확한지 확인하는 작업을 한다. TCP의 장점은 일단 연결이 되면 송신 시스템과 목적지 시스템은 연결이 끊길 때까지 끊임없이 자료를 주고 받는다. 다시 말하자면, 송신 시스템에서는 시스템에게 데이터를 전송하고, 목적지 시스템은 데이터를 데이터를 받은 경우 이에 다시 응답을 하도록 되어있다. 혹시, 목적지 시스템이 받은 데이터에 대한 응답을 하지 않을 경우, 송신 시스템은 일정 기간을 대기한 후에 똑 같은 데이터를 다시 전송한다. 이러한 방식으로 실행을 하면 데이터가 안전히 이동 가능하다. 뭐 요즘 흔히 쓰는 http가 바로 이에 대한 예라고 말할 수 있다.
TCP의 연결 과정을 보도록 하겠다
S:Port확인->목적지와 연결(3way)->데이터사이즈 조절(window)->송신->송신 메시지 전달
D:수신->Port확인->데이터 확인->수신 메시지 전달->종료
예를 들어서 상황을 만들어서 조금 더 이해하기 쉽도록 설명을 하겠다.
호스트 A가 호스트 B에게 연결을 한다는 상황이다.
호스트 A 호스트 B
----------------------------------------à
SYN(1000)
ß--------------------------------------
SYN(4000), ACK(1001)
----------------------------------------à
ACK(4001)
1. 호스트 A는 호스트 B에 연결을 설정하고 싶다는 요청과 함께 랜덤하게 만든 시퀀스 넘버 1000으로 SYN패킷을 호스트 B에게 보낸다.
2. 호스트 B는 랜덤하게 생성된 시퀀스 넘버 4000으로 SYN 패킷에, ACK 번호 1001로 설정하여 호스트 A에게 보낸다.(ACK 번호는 대부분 A에게서 받은 SYN+1의 값을 가진다.)
3. 호스트 A는 호스트 B에게서 받은 시퀀스 넘버를 사용하여 ACK번호(SYN+1)를 호스트 B에게 보낸다.
한마디로 말하자면, 서로에게 자기들만이 정한 숫자를 보내고 그 숫자에 1을 더한 숫자를 받아야지만 자료 전송을 시작한다는 뜻이다. 만약, 서로 보낸 숫자가 다르면 즉시 자료 전송은 취소된다.
이렇게 자료를 전송하면 전송을 하는 것을 종료시키는 방법도 말하도록 하겠다.
이 경우도 호스트 A와 호스트 B가 연결을 종류 시키는 상황에 대해서 말을 하도록 하겠다.
호스트 A 호스트 B
----------------------------------------------à
FIN(2500)
ß----------------------------------------------
ACK(seq:7000, ack:2501)
ß----------------------------------------------
FIN(seq:7001, ack:2501)
-----------------------------------------------à
ACK(seq:2502, ack:7501)
1. 호스트 A가 연결을 종료하는 요청 세그먼트를 호스트 B에 전달한다.
2. 호스트 B는 호스트 A의 요청에 따라 ACK 메시지를 전송한다.
3. 호스트 A에서 호스트 B로 한쪽 방향의 연결만 종료 되고, 호스트 B는 여전히 호스트 A에 데이터 전송이 가능하다.
4. 호스트 B가 데이터를 모두 전송한 후에 연결 종료 메시지를 전송하면 호스트 A가 ACK 메시지를 전송하고 모든 연결이 종료된다.
이 그래프에서 간단한 용어 설명을 하겠다.
Source, Destination Port: 출발지와 목적지 포트 번호
Sequence Number: 전달되는 바이트에 대한 Sequence Number로 1씩 증가한다.
Acknowledgement: 수신 측에서 수신하고자 하는 바이트의 번호
Checksum: 데이터를 포함한 세그먼트 전체의 오류를 검사하기 위한 필드
Urgent Pointer: 긴급 데이터를 우선적으로 처리할 것을 수신 측에게 알리기 위한 목적으로 사용하사 필드
Flag
-URG: 긴급 포인터가 있다는 것을 나타냄 (1-긴급, 0-일반)
-ACK: 확인 응답번호가 기술되어있음(1-ACK, 0:ACK 없으)
-PSH:데이터를 주고 받을 때 사용한다.
-RST: 연결을 재설정 할 때 사용한다.
-SYN: 연결을 초기화하기 위해 순서번호를 동기화
-FIN: 송신 측이 데이터 전송을 종료
여기까지가 TCP에 관한 설명이다. 드디어!!!UDP에 관한 이야기를 할거지만 바랬던 것처럼 길지는 않다. 거의 TCP 내용에서 몇 가지 빠진 정도이기 때문에 매우 짧게 느껴질지도 모른다. 여튼, UDP에 관한 설명을 시작하겠다.
UDP는 TCP와 달리 상대방이 보낸 응답을 확인하지 않아서 송신 시스템이 전송하는 데이터에 대한 목적지 시스템이 생략되어 있어서 네트워크에 부하를 걸지 않는다. 하지만, 데이터 자체의 신뢰성이 없어서 수신된 데이터의 무결성을 보장받지 못한다. 또한, UDP의 단점은 상호 커뮤니케이션이 이루어지는 것이 아니기 때문에 전송 도중 손실된 데이터 대한 재전송을 요구하지 않는 다는 것이다. 즉, 손실된 데이터를 그대로 둔 상태에서 데이터를 전송하는 것이다. 또한, UDP는 손실된 데이터의 정보를 알 수 없고 손실 데이터를 재전송할 수도 없다.
뭐 위에서 TCP에서 한 듯이 UDP도 연결 과정을 말해보도록 하겠다.
S: Port확인->송신
D:수신->Port확인->종료
이에서 볼 수 있듯이 매우 단순화 되 있어서 속도 하나만큼은 짱이다.
Source, Destination Port: 출발지, 목적지 포트번호
Length: 헤더와 데이터를 합한 사용자 데이터 그램의 전체 길이(0~65,535)
Checksum:데이터 그램의 헤더와 데이터 전체의 오류 검사를 위해 사용
총 정리를 하자면, TCP는 수신자와 일단 확인을 한 뒤에 자료 전송을 시작하지만, UDP는 단순히 상대방을 확인하고 바로 자료를 전송하기 때문에 자료 전송 도중에 자료가 손상될 가능성도 있지만 TCP에 비해 속도가 비약적으로 빠르다. 이 때문에 스타크래프트 II에서도 UDP의 방식을 사용한 거 같다. 그럼 나는 여기까지!
댓글 없음:
댓글 쓰기