SECTION
01
전송 계층 관련 프로토콜 분석
1. TCP 헤더 분석
• 전송계층이 해야 할 일.
• 다양한 응용 프로그램들이 인터넷을 사용할 수 있는 멀티 인터페이스를 제공.
• 전송된 데이터의 무결성을 보장.
• 네트워크의 상태는 매우 유동적이기 때문에 이에 맞추어 혼잡 제어.
• 연결을 설정하는 문제와 해제하는 문제를 담당.
SECTION
01
전송 계층 관련 프로토콜 분석
• 전송계층이 해야 하는 대표적인 작업을 담당하는 프로토콜이 TCPTransmission Control Protocol
• 응용 프로그램이 소켓을 통해 인터넷으로 전달할 데이터를 보내면 TCP는 TCP 헤더를 붙여서 IP로 내려
보냄
.
• IP는 IP 헤더를 붙여 이더넷으로 내려 보내면 이더넷이 데이터를 전송.
SECTION
01
전송 계층 관련 프로토콜 분석
• TCP 헤더는 IP헤더오 마찬가지로 32비트(4바이트)를 기준으로 나눔 -> TCP 헤더의 필수 부분은 5 x
4바이트 = 20바이트, 옵션은 없을 수 있으며, 있더라도 4바이트씩 증가.
SECTION
01
전송 계층 관련 프로토콜 분석
• TCP를 사용하는 모든 응용 프로그램들이 포트를 사용하여 구분되기 때문에 보내는 쪽 포트(Source
Port)와 받는 쪽 포트(Destination Port) 둘 다 표시하여 보냄.
• TCP의 구조상, 받는 쪽 포트를 알아야지만 데이터를 보낼 수 있음.
• 받는 쪽의 응용 프로그램이 웹 데몬(HTTPD)와 같이 잘 알려진 소프트웨어라면 0에서 1023
번까지의
well-known 포트 번호를 가지고 있음.
• 포트번호의 길이는 16비트이다. 따라서 0에서 65535까지의 포트번호를 가짐.
• 일반적인 응용 프로그램이라면 1024번 이상 65535이하의 임의의 값을 포트번호로 할당 받음.
SECTION
01
전송 계층 관련 프로토콜 분석
• 네트워크에서 데이터를 전송하는 과정에서 순서가 뒤바뀌거나 사라지는 문제가 발생.
• 데이터 전송에는 2번줄 Sequence Number(일련번호)와 3번줄 Acknowledge Number(ACK 번
호
)를 사용.
• 일련번호와 ACK 번호는 연결을 설정하고 해제하는데도 사용.
• 컴퓨터가 켜진 후 꺼질 때 까지 무수히 많은 수의 데이터를 전송하기 때문에 일련번호와 ACK 번호는
충분히 커야 함
.
• 일련번호와 ACK 번호에 32비트를 할당하였기 때문에 0부터 232 - 1까지, 약 42억개의 번호를 사용 할
수 있음
.
SECTION
01
전송 계층 관련 프로토콜 분석
• THL: THL은 TCP Header Length의 약자. 옵션을 포함한 TCP 헤더 길이를 나타냄. 데이터는
포함되지 않음
. THL 필드에 들어 있는 값은 4 바이트 단위의 줄의 길이를 의미. 따라서 옵션이 없는
경우에는
THL에는 5가 들어 있음.
• ECE : IP 헤더에서 ECNExplicit Congestion Notification 필드와 연동되는 필드가 ECEExplicit Congestion notification Echo.
ECE는 ECN-Echo로 부름. IP 헤더에서 ECN은 혼잡제어에 사용되며, 네트워크에 혼잡이 발생하여
패킷이 제대로 전달되지 않을 경우 활성화 됨
(ECE가 1). ECE를 ECN-Echo라 부르는 이유는 IP의
ECN이 네트워크가 혼잡하여 윈도우 크기를 줄인다고 결정하면, TCP의 ECE가 1로 바뀌기 때문.
윈도우 크기를 줄여 혼잡을 완화하는 작업은
TCP에서 이루어지지만 라우터의 혼잡한 상태를 확인 할 수
있는 것은 네트워크 계층
.
• CWR : CWR은 Congestion Window Reduced의 약자로 ECE를 받아 윈도우 크기를 줄였다는 것을
확인하는 필드
. 또한 ECE를 중복적으로 보내지 않아도 된다는 의미.
SECTION
01
전송 계층 관련 프로토콜 분석
• URG : URG는 Urgent의 약자로 긴급하게 처리해야할 데이터가 있는 경우 1이 됨.
• ACK : TCP 헤더의 ACK 번호가 의미가 있는 경우 ACK가 1이 됨. ACK가 0이면 ACK 번호는 무시.
• PSH : PSH는 push를 의미. PSH 필드가 1이 되면, 순서가 맞지 않아도 버퍼에 있는 데이터를 응용
계층으로 무조건 올려 보냄
.
• SYN : SYN는 Synchronize를 의미하며 연결 설정에 사용되는 Connection Request(CR)을 의미.
연결을 설정할 때
SYN 필드가 1이 됨.
• FIN : FIN은 Finalize를 의미하며 연결 해제에 사용되는 Disconnection Request(DR)을 의미.
연결을 해제 할 때
FIN 필드가 1이 됨.
• RST : RST는 Reset을 의미한다. 연결 설정이나 연결 해제를 원만히 이루어지지 않을 경우 RST는
필드를
1로 만들면 리셋하자는 의미.
• Window Size: 슬라이딩 윈도우 프로토콜의 윈도우 크기를 나타냄. 윈도우의 크기 필드가 16비트이기
때문에 윈도우의 최대 크기
(ACK 없이 보낼 수 있는 데이터의 개수)는 65536개.
SECTION
01
전송 계층 관련 프로토콜 분석
• Checksum: 에러 검사 코드인 체크썸Checksum이 들어 있으며 크기는 16비트. TCP의 체크썸은 헤더와
데이터 모두 검사
.
• Urgent Pointer: Urgent Pointer는 4번 줄 URG(Urgent)가 1이 되면 의미가 생기는 필드. 통신을
하던 중 긴급하게 처리해야 하는 데이터가 있다면
, URG가 1이 됨. URG가 1이 된 경우, 데이터 중
긴급하게 처리 되어야 하는 위치를
Urgent Pointer가 가지고 있음.
SECTION
2. UDP
01
전송 계층 관련 프로토콜 분석
• 화상회의나 유튜브와 같이 TCP의 작업은 부담스러운 경우를 위해 만든 프로토콜이 UDP, 영어로 User
Datagram Protocol.
• 안정성보다는 속도를 요구하는 네트워크 통신에는 UDP/IP를 사용.
• UDP 헤더.
• 1번 줄은 TCP 헤더와 마찬가지로 보내는 쪽 포트(Source Port)와 받는 쪽 포트(Destination
Port).
• 2번줄 UDP Length는 데이터를 포함한 UPD의 전체 길이를 나타냄. 표시 단위는 바이트.
• 헤더를 포함한 UDP 전체에 대하여 에러검출 코드로 체크썸을 사용.
SECTION
3. RTP
01
전송 계층 관련 프로토콜 분석
• RTP는 스트리밍 데이터의 전송을 위해 설계된 실시간 전송 프로토콜Real-time Transport Protocol
• 주로 인터넷 전화(VoIPVoice over IP), 동영상 스트리밍, 화상통신과 같은 멀티미디어 통신에 사용.
• TCP나 UDP는 운영체제가 인터넷을 사용하는 응용 프로그램에게 제공하는 통신 서비스.
• RTP는 UDP 사용하여 빠르게 데이터를 전송하도록 설계.
• RTP의 또 다른 특징은 다양한 비디오 및 오디오 포켓을 지원하기 위하여 헤더에서 기능을 추가하거나 뺄
수 있도록 설계
.
SECTION
01
전송 계층 관련 프로토콜 분석
• RTP를 사용하는 경우, RTP 헤더 - UDP 헤더 - IP 헤더 - 이더넷 헤더들이 차례로 붙음.
• RTP는 지터 보상, 패킷 손실, 느린 전송 감지 기능들을 제공.
• RTP는 일 대 일 통신 뿐 아니라 멀티캐스트를 통해 여러 곳에 데이터를 전송할 수 있게 해 줌.
SECTION
01
전송 계층 관련 프로토콜 분석
• 옵션을 제외한 RTP 헤더의 기본 크기는 3줄(12바이트)이다. 헤더의 옵션은 4바이트 단위로 증가.
• ver (version): RTP 버전 번호이며 현재는 2.
• P (padding): RTP 마지막에 패딩 데이터가 존재하는 경우 1이 되는 필드.
• x (extention): RTP 헤더의 마지막에 RTP Header extention이 존재하는 경우 1이 됨.
SECTION
01
전송 계층 관련 프로토콜 분석
• CC (CSRC Count): RTP에서 발신자를 구분하는 고유번호는 3번 줄의 SSRCSynchonization source임.
발신자가 여러 개인 경우
CSRCContribution source가 붙음. CSRC는 1개에서 N개까지 사용할 수 있는데 CC
는
CSRC의 개수를 나타냄.
• M (marker): 마커는 응용프로그램이 필요할 때 사용할 수 있는 필드.
• payload type: 헤더 다음에 이어지는 데이터의 종류를 나타낸다. 사진, 음악, 동영상과 관련된 각종
인코딩 데이터가 표시 됨
.
• Sequence number: RTP는 UDP를 기반으로 만들어졌기 때문에 패킷이 손실될 수 있음. Sequence
number는 패킷의 손실이나 순서가 뒤바뀌는 경우를 확인하기 위해서 만들어진 필드.
• Timestamp: 데이터의 생성시간을 나타냄.
• RTP는 RTCPRTP Control Protocol와 결합하여 사용.
SECTION
4. 혼잡제어
01
전송 계층 관련 프로토콜 분석
• 혼잡제어를 위해서 TCP에서는 ECEExplicit Congestion notification Echo와 CWRCongestion Window Reduced 필드가
사용되고
IP에서는 ECNExplicit Congestion Notification이 사용됨.
• 혼잡제어를 위해서는 TCP의 연결설정 단계에서 양쪽이 ECN을 사용할 것인지를 합의해야 함.
• 혼잡제어를 사용을 원하는 호스트 A는 연결설정에서 SYN, CWR, ECE 필드를 1로 만들어 보냄 ->
이를 받은 호스트
B는 혼잡제어에 동의 할 경우 SYN, ACK, ECE 필드를 1로 만들어 보냄.
SECTION
01
전송 계층 관련 프로토콜 분석
• 만약 호스트 B가 혼잡제어가 필요 없다고 판단되는 경우에는 SYN, ACK만 보낸다. 이 경우 혼잡제어는
무시
.
SECTION
01
전송 계층 관련 프로토콜 분석
• 양쪽이 혼잡제어에 동의하는 경우.
• TCP의 윈도우 크기를 줄이도록 결정하는 것은 IP의 ECN 필드, ECN은 ECTECN Capable Transport 비트와
CECongestion Experienced 비트 두 개로 구성 -> ECN 필드가 (0, 0)으로 설정되면 혼잡제어를 안 한다는
의미
-> (0, 1) 혹은 (1, 0)으로 설정되면 라우터에게 혼잡제어를 하라는 의미(ECT 상태).
• 라우터에서 혼잡이 발견되면 라우터는 받는 쪽(호스트 B)로 ECN 필드를 (1, 1)로 만들어 보냄(CE 상
태
) -> 호스트 B는 TCP의 ECE를 1로 만들어 호스트 A에게 보냄 -> ECE를 받은 호스트 A는 슬라이딩
윈도우의 크기를 줄이고
, ECE에 대한 확인으로 CWR을 1로 만들어 보냄.
SECTION
1. 소켓 프로그래밍 개요
02
소켓 프로그래밍
• 여러개의 응용 프로그램들이 TCP를 사용하여 통신하는 과정.
• 운영체제는 0에서 65535까지의 포트 번호를 중 비어있는 번호를 응용 프로그램에게 제공.
• 서버쪽 포트에는 여러개의 소켓이 연결, 클라이언트들은 포트에 연결된 멀티 소켓에 하나씩 연결됨
-> 응용 프로그램들이 통신을 하려면 소켓에 접속해야 함.
• 클라이언트 소켓은 connect()를 사용하여 서버 쪽 소켓과의 연결을 시도 -> connect()를 받아주는
것은 서버쪽의
accept() 함수.
• connect() 이전에 accept()가 준비되어야 함으로 서버쪽 코드를 실행 후 클라이언트 코드를 실행.
SECTION
02
소켓 프로그래밍
• 소켓 사용방법은 파일에서 데이터를 읽거나 쓰는 작업과 유사 함.
• 파일을 사용하기 위해서는 해당파일이 존재하는지, 존재한다면 파일에 접근할 권한이 있는지를 먼저
살펴봐야 함
.
• 파일을 사용하려면 준비단계가 필요한데, 이 함수가 open().
• fd = open("파일이름")이 성공적으로 끝났다면 파일에 접근 할 수 있는 열쇠(fd)를 줌 -> 열쇠를
이용하여 파일에 있는 데이터를 읽거나 쓸 수 있음
.
• 작업을 한 후에는 열쇠를 반환해야 한다. 열쇠를 반환하는 작업이 close(fd).
• open() - read() / write() - close() 순으로 파일 작업이 이루어짐.
SECTION
02
소켓 프로그래밍
• unix.txt 파일에 문자 데이터 Test를 쓰는 코드
SECTION
02
소켓 프로그래밍
• 소켓 통신 socket() - send() / recv() - close() 순.
• send(cs): 소켓에 쓰기write 연산을 하면 데이터를 보낸다는 의미. recv(cs): 소켓에서 읽기read 연산을
하면 데이터를 가져온다는 의미
.
• cs = socket() 이 후에 클라이언트 소켓이 서버에 접속하는 과정(connect())과 서버가 이를
받아들이는 과정
(accept())이 추가.
SECTION
02
소켓 프로그래밍
• 클라이언트 쪽의 경우, socket() - connect() - send() / recv() - close() 순으로 작업이 이루어짐.
• 먼저 실행되어야 할 서버 쪽의 경우 socket() - accept() - send() / recv() - close() 순으로 작업이
이루어짐
.
• cs = socket()이 성공하면 열쇠(cs)를 주는데 이를 소켓 기술자socket descriptor라 부름 -> 이후의 모든
작업은 소켓 기술자
(cs)를 통해 이루어짐.
• connect()가 서버와의 접속을 시도 함. 이후 서버에게 데이터를 보내는 경우 send()를 사용하고,
서버로부터 데이터를 받을 때는
recv()를 사용.
• 소켓 사용을 마치면 close()를 사용하여 소켓 기술자를 반환.
• 클라이언트와 달리 서버 쪽에는 bind()와 listen()이 추가.
• 서버 쪽에는 포트 하나에 여러개의 소켓이 연결됨 -> 포트에 여러 개의 소켓을 연결하는 단계가
bind(). 한번만 실행하면 됨.
• listen()은 여러개의 소켓들을 사용할 수 있는 상태로 만드는 함수 -> listen()은 accept()와
쌍으로 사용
. 소켓을 듣고 있다(listen())가 클라이언트들이 접속을 시도하면 그 중의 하나를
받아들이는
(accept()) 형태.
SECTION
02
소켓 프로그래밍
SECTION
02
소켓 프로그래밍
• 소켓과 인터넷에 관련된 라이브러리는 4번줄 <sys/socket.h>와 5번줄 <arpa/inet.h>에 있음.
• 10번줄 sockaddr_in은 IP 주소나 포트번호와 같은 주소 정보를 가지는 구조체.
• 12번 줄 memset(&csa, 0, sizeof(csa))은 주소 구조체 csa를 초기화 함.
• 13번 줄 csa.sin_family = AF_INET는 인터넷을 사용하겠다는 의미.
• 14번 줄 csa.sin_addr.s_addr = inet_addr(127.0.0.1)는 서버의 IP 주소를 설정.
• 15번 줄의 csa.sin_port = htons(11234)은 서버의 포트 번호를 설정. 서버 포트번호는 11234임.
서버
IP 주소 127.0.0.1은 루프 백loop-back 주소라 불리는 특별한 IP 주소 -> 컴퓨터가 고정 IP 주소를
가진 것처럼 만들어 줌
.
• 17번 줄 cs = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)에서 소켓을 open. socket()
매개변수 중
IPPROTO_TCP는 TCP를 사용하여 통신한다는 의미.
• 18번줄 connect(cs, (struct sockaddr *) &csa, sizeof(csa))에서 서버와 연결.
• 20번 줄 recv(cs, buf, 5, 0)에서 소켓으로부터 5바이트 문자를 받아 buf에 저장.
• 21번 줄에서 buf에 저장된 문자열을 출력.
• 23번 줄 close(cs)에서 소켓 기술자를 닫음.
SECTION
02
소켓 프로그래밍
SECTION
02
소켓 프로그래밍
• 12번 서버에서는 클라이언트의 주소를 알 수 없기 때문에 htonl(INADDR_ANY)라고 지정.
• 15번 줄 ss = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)에서 소켓을 open.
• 16번 줄 bind(ss, (struct sockaddr *) &ssa, sizeof(ssa))에서 소켓을 연결.
• 18번 줄 서버는 무한 루프를 돌면서(while(1)) 클라이언트의 요청이 있을 때마다 서비스를 해줌.
• 19번 줄 listen(ss, 10)에서 여러 소켓들을 활성화 함
• 20번 줄 sa = accept(ss, 0, 0)에서 소켓에 연결된 클라이언트를 받아들임. listen(ss, 10)에서는
소켓 기술자
ss가 사용됐지만, sa = accept()에서 소켓 기술자가 sa로 바뀌는 것에 주의. sa = ac-
cept()에 의해 실제로 받아들여진 소켓 기술자는 sa 임. listen(ss, 10)에서 10은 서버의 작업을
기다리는 클라이언트 소켓 대기열의 크기를 가리킴
.
• 21번 줄 send(sa, "test", 5, 0)에서 클라이언트에게 문자열 "test"을 보냄. test는 4글자이지만
문자열 끝을 알리는
'\n'가 추가되기 때문에 전체 크기는 5바이트 임.
• 22번 줄 close(sa)에서 클라이언트 소켓 sa를 닫음. 맨 처음 열린 서버 소켓 기술자 ss는 아직 살아
있다기 때문에 클라이언트가 몇 번을 접속하더라도 문자열
"test"를 보낸다.
SECTION
02
소켓 프로그래밍
• 유닉스 상에서 서버와 클라이언트 소켓 코드를 실행하는 방법.
• 서버와 클라이언트 코드를 컴파일 함 -> gcc -o server server.c를 사용하여 server라는 실행
파일을 만들고
, gcc -o client client.c를 사용하여 client 실행 파일을 만듦.
• 서버는 백그라운드background로 실행.
• 클라이언트 프로그램을 실행 시키면 서버로부터 "test"를 받아 Receive [test]가 출력됨.