1 / 57

제 2 장 TCP/IP 프로토콜과 헤더의 구조

기초부터 배우는 TCP/IP 네트워크 . 제 2 장 TCP/IP 프로토콜과 헤더의 구조. 김 지 현 jhkim@netwk.hannam.ac.kr. 목차. DNS IP Address 프로토콜 헤더와 구조체 IP 헤더 메모리의 정렬 바이트 오더 Ethernet MAC Address ARP IP 경로 MTU 탐색 ICMP UDP TCP Q & A. DNS. DNS(Domain Name System) 영문으로 구성되는 도메인 이름을 IP Address 로 변환하기 위해 필요

lamya
Download Presentation

제 2 장 TCP/IP 프로토콜과 헤더의 구조

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 기초부터 배우는 TCP/IP 네트워크...... 제2장 TCP/IP 프로토콜과 헤더의 구조 김 지 현 jhkim@netwk.hannam.ac.kr

  2. 목차 • DNS • IP Address • 프로토콜 헤더와 구조체 • IP 헤더 • 메모리의 정렬 • 바이트 오더 • Ethernet • MAC Address • ARP • IP • 경로 MTU 탐색 • ICMP • UDP • TCP • Q & A

  3. DNS • DNS(Domain Name System) • 영문으로 구성되는 도메인 이름을 IP Address 로 변환하기 위해 필요 • 도메인 이름과 그에 대응되는 IP Address 가 저장된 테이블을 가지고 있음 • IP Address 로의 변환 요청이 발생하면 테이블을 검색하여 변환 도메인 이름 + IP 주소 테이블을 통한 검색 IP(Internet Protocol) IP Address 로 변환 요청 << 애플리케이션>> 도메인 이름

  4. IP 주소 • 주소의 클래스 • 이진 표기법으로 클래스 찾기 • 십진 표기법으로 클래스 찾기 If 첫번째 비트 = 0 then Class A Else if 두번째 비트 = 0 then Class B Else if 세번째 비트 = 0 then Class c Else if 네번째 비트 = 0 then Class d Else Class E

  5. 프로토콜 헤더와 구조체 • 패킷 포맷 • Ethernet 헤더 트레일러 • 종착점 MAC 어드레스 6 옥텟 • 시작점 MAC 어드레스 6 옥텟 • 타입 2 옥텟 • FCS 4 옥텟 • IP 헤더 • 버전 4 비트 • 헤더 길이 4 비트 • 서비스 타입 1 옥텟 • 패킷 길이 2 옥텟 • 식별자 2 옥텟 • 플래그 3 비트 • 프래그먼트 오프셋 13 비트 • 생존 기간 1 옥텟 • 프로토콜 번호 1 옥텟 • 헤더 체크섬 2 옥텟 • 시작점 IP 어드레스 4 옥텟 • 종착점 IP 어드레스 4 옥텟 IP 헤더 TCP 헤더 Ethernet 헤더 • TCP 헤더 • 시작점 포트 번호 2 옥텟 • 종착점 포트 번호 2 옥텟 • 시퀀스 번호 4 옥텟 • 확인 응답 번호 4 옥텟 • 오프셋 8 비트 • 예약(미사용) 6 비트 • 컨트롤 플래그 6 비트 • 윈도 사이즈 2 옥텟 • 체크섬 2 옥텟 • 긴급 포인터 2 옥텟

  6. IP 헤더 • 메모리 상의 배치

  7. 버전,헤더 길이 : 각각 4bit Structure ip{ u_int ip_v:4, /* version */ u_hl:4 /* header length */ } IP 헤더 • 구조체 사용 이유 • 길이가 다른 필드가 섞여 있어도,하나의 데이터 덩어리로 관리 가능 • 각각의 필드 크기에 맞춰서 적절한 형태의 변수로 선언 • char 형 외에는 변수의 바이트수가 정해져있지 않음 • 1 옥텟보다 작은 값을 다룰 경우 • 비트 필드나 마스크 처리가 이용 • 비트 필드는 구조체의 멤버만 사용 가능 • 비트 필드의 총 길이에 따라 바이트 길이를 적절하게 준비 • 8 비트 이하 : 1 바이트 • 16 비트 이하 : 2 바이트

  8. IP 헤더 • 마스크 처리 • IP의 프래그먼트 오프셋 등에서 사용 Struct ip{ u_short ip_off; /* fragment offset field*/ } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Ip_off 프래그먼트 오프셋 #define IP_RF 0x8000 #define IP_DF 0x4000 #define IP_MF 0x2000 #define IP_OFFMASK 0x1fff 모어 프래그먼트 플래그 분할 금지 플래그 예약 플래그

  9. IP 헤더 • 이진수로 나타낸 마스크 Ip_off IP_RF 0x8000 IP_DF 0x4000 IP_MF 0x2000 IP_OFFMASK 0x1fff ip_off 의 값을 Set : ip_off = ip_off | IP_DF; /* set */ ip_off 의 값을 Clear : ip_off = ip_off & (~IP_DF); /* clear */ Ip_off 의 2번째 비트가 1일 때에만 특정 처리가 필요한 경우 if (ip_off & IP_DF){ 처리내용 }

  10. IP 헤더 • 배열에 의한 헤더의 처리 • 필드의 길이와 맞는 형태가 없을 경우 사용 • 배열을 대입 또는 비교하는 연산자가 없으며 아래와 같은 함수를 호출하여 처리 #include <string.h> Void *memset(void *s, int c, size_t n); Void *memcpy(void *dest, const void *src, size_t n); Void *memmove(void *dest, const void *src, size_t n); Int memcmp(const void *s1, const void *s2, size_t n); • memset : 어드레스 s 에서 c 바이트의 영역을 n으로 채움 • memcpy , memmove : 어드레스 src 에서 n 바이트의 영역을 어드레스 dest 에서 시작하는 영역에 복사 • memcmp : 어드레스 s1과 어드레스 s2 의 각각의 영역 선두에서 n 바이트의 영역을 1 바이트씩 비교 비교결과 같은 경우 : 0 반환 s1이 큰 경우 : - 값 반환 s2가 큰 경우 : + 값 반환

  11. 메모리의 정렬 • 메모리의 정렬 • 구조체 멤버를 메모리에 배치할 때에 짝수 어드레스나 4의 배수 어드레스에서부터 시작되도록 정렬하는 것 Struct align_test{ char a; char b; int c; } align_test; 정렬된 경우 정렬되지 않은 경우 1000 Char a; 1000 Char a; Char b; 1001 Char b; 1001 1002 미사용 1002 1003 미사용 1003 1004 Int c; 1004 1005 1005 Int c; 1006 1007

  12. 바이트 오더 • 바이트 오더 • 2바이트 이상의 데이터를 메모리에 저장하는 방법의 차이 • 빅 엔디언과 리틀 엔디언의 2개의 바이트 오더가 사용

  13. 바이트 오더 • 빅 엔디언 • 데이터 값의 최상위 비트가 어드레스의 선두에 오도록 저장 • 리틀 엔디언 • 데이터 값의 최상위 비트가 어드레스의 제일 후미에 오도록 저장 • 네트워크 속을 흐르는 패킷 • 빅 엔디언과 똑같이 상위 비트를 선두에 배치하는 순서 • 네트워크 바이트 오더라고 함 • 문제점 • 빅 엔디언과 리틀 엔디언의 저장 방식의 차이에 의한 문제점 • 어떤 바이트 오더이건 상관없이 변환할 수 있는 함수가 요구

  14. 바이트 오더 • 바이트 오더 변환 함수 • 비트 단위로 처리될 경우 IP 나 TCP 의 헤더등 TCP/IP 프로토콜의 헤더는 모두 네트워크 바이트 오더에 저장 #include <netinet/in.h> u_long int htonl(u_long int hostlong); u_short int htons(u_short int hostshort); u_long int ntohl(u_long int netlong); u_short int ntohs(u_short int netshort); #if BYTE_ORDER == LITTLE_ENDIAN u_int ip_hl : 4 ; /* header length */ ip_v : 4 ; /* version */ #endif #if BYTE_ORDER == BIG_ENDIAN u_int ip_v : 4 ; /* version */ ip_hl : 4 ; /* header length */ #endif

  15. Ethernet • Ethernet • 브로드캐스트형 네트워크 • 네트워크에 접속되어 있는 모든 호스트에 패킷을 전달하는 방식 • LAN : 특정 영역 내의 네트워크 ≠ Ethernet : 소규모 네트워크 구성 • Ethernet 세그먼트 : 각각의 Ethernet 범위 • NIC 의 ROM에는 6 옥텟(:으로 구분)의 MAC 어드레스가 기입 • MAC 어드레스는 모든 NIC 를 통틀어 중복되지 않게 관리

  16. Ethernet • Ethernet 의 프레임 포맷과 구조체의 정의 • Ethernet 헤더 구조체 프레임이 흘러가는 방향 시작점 MAC 어드레스 (6옥텟) 타입 (2옥텟) 데이터 (46 ~ 1500옥텟) FCS (4옥텟) 종착점 MAC 어드레스 (6옥텟) Struct ether_header{ u_char ether_dhost[ETHER_ADDR_LEN]; u_char ether_shost[ETHER_ADDR_LEN]; u_short ether_type; };

  17. Ethernet • Ethernet 의 기본 동작 • 데이터의 송신전에 다른 호스트의 데이터 송신 여부를 체크 • 송신 데이터의 충돌시 난수시간을 대기후 재전송 • CSMA/CD • Carrier Sense Multiple Access with Collision Detection • 여러 개의 호스트에서 같은 신호선을 공유해서 프레임을 송신하고,충돌을 검출하고, 송신을 제어하는 것 • 라우터를 건너뛸 수 없음 • 라우터에서 격리된 호스트와 통신하기 위해서는 IP 프로토콜을 이용

  18. MAC Address • MAC 어드레스와 비트의 순번 • 호스트 내부에서 관리할때와 네트워크 안을 흐를때의 MAC 어드레스가 다름 • Ethernet 이 처음 개발된 VAX 의 아키텍쳐의 영향

  19. ARP • ARP(Address Resolution Protocol) • Ethernet 이나 토큰링 등의 브로드캐스트형 데이터 링크에 사용되는 프로토콜 • IP 어드레스를 검색하는 MAC 어드레스를 검색할때 사용 • 하드웨어 어드레스 : 검색할 어드레스(MAC어드레스) • 프로토콜 어드레스 : 검색할 어드레스의 근원이 되는 어드레스(IP 어드레스) • 어드레스의 길이는 가변으로 다루어 짐

  20. ARP • ARP의 패킷 포맷 • Arp_hrd : 하드웨어 어드레스의 종류를 나타냄 • #define ARPHRD_ETHER 1 • Arp_pro : 프로토콜의 종류를 나타냄 • Ethernet 의 타입 필드에 넣어지는 값과 같은 값이 저장 • Arp_hln : 하드웨어 어드레스의 길이를 나타냄 • Ethernet 은 MAC 어드레스의 길이가 6이므로,6이 저장됨 • arp_op : ARP 가 어떤 처리를 요구하고 있는지를 나타냄 • arp의 요구 :1 arp 의 응답 : 2 • ARPOP_REQUEST,ARPOP_REPLY 라고 정의되어 있음 struct arphdr{ u_short ar_hrd; u_short ar_pro; u_char ar_hln; u_char ar_pln; u_short ar_op; }; struct ether_arp{ struct arphdr ea_hdr; u_char arp_sha[ETHER_ADDR_LEN]; u_char arp_spa[4]; u_char arp_tha[ETHER_ADDR_LEN]; u_char arp_tpa[4]; };

  21. ARP • ARP 패킷 포맷

  22. ARP • ARP 프로토콜의 동작 • ARP 프로토콜을 이용하여 알아낸 정보는 ARP 테이블에 기억 • ARP 테이블은 캐쉬로 저장

  23. 버전 Version ip_v 헤더의 길이 Header Length ip_hl 서비스 타입 Type Of Service ip_tos 패킷의 길이 total length ip_len 식별자 Identification ip_id 플래그 Flag 프래그먼트 오프셋 Fragment Offset ip_off 재생 시간 Time to Live ip_ttl 프로토콜 번호 protocol ip_p 헤더 체크섬 Header Checksum ip_sum 시작점 IP 어드레스 Source IP Address ip_src 종착점 IP 어드레스 Destination IP Address ip_dst IP • IP • 목적 호스트까지 패킷을 보내는 역할 • IP 헤더를 해석하여 패킷의 송/수신을 처리 • 모든 호스트나 라우터에 IP 어드레스가 부여 • IP Forward : 다른 호스트에 대한 IP 데이터그램을 수신한 경우 IP 데이터그램을 전송하는 것 0 4 8 16 19 31 IP 헤더의 구조

  24. IP • IP 헤더의 구조 • 헤더 길이(ip_hl) • IP 헤더의 길이를 나타냄 • 4옥텟 단위로 계산되므로,5 값이 저장됨 • C 언어로 처리시 4배 또는 ¼로 처리 • 시프트(>> or <<)연산을 통한 처리 Struct ip{ #if BYTE_ORDER == LITTLE_ENDIAN u_int ip_hl : 4, /* header length */ ip_v : 4 ; /* version */ #endif #if BYTE_ORDER == BIG_ENDIAN u_int ip_v : 4, /* version */ ip_hl : 4; /* header length*/ #endif u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src; /* source address */ struct in_addr ip_dst; /* dest address */ IP 구조체

  25. IP • 서비스 타입(ip_tos) • IP 데이터그램을 배송할 때의 서비스 품질을 라우터에게 지시하기 위해 사용 • 8 bit 우선도 서비스 타입 미사용 낮은 비용 높은 신뢰성 높은 처리량 낮은 지연 시간 높은 우선도 낮은 우선도 111 110 101 100 011 010 001 000

  26. IP • 패킷의 길이 • IP 데이터그램의 전체의 길이 • 16비트(0~65535) • IP가 운반하는 최대의 데이터 = 65535 – 20 = 65515 옥텟 • 식별자 • IP 프래그먼트 처리에 사용 • 16비트의 길이 • 전원 주입시 식별자 초기값이 결정 • IP 데이터그램을 1개 송신하면 식별자 값이 1씩 더해짐

  27. IP • 플래그와 프래그먼트 오프셋 • RF(Reserved Fragment) : 예약 플래그 • 0번 비트로 0을 포함하도록 정해져 있음 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 플래그, 프래그먼트 오프셋 ip_off 필드 프래그먼트 오프셋 모어 프래그먼트 플래그 분할 금지 플래그 예약 플래그 IP_RF 0x8000 IP_DF 0x4000 IP_MF 0x2000 IP_OFFMASK 0x1fff

  28. IP • DF(Don’t Fragment) : 프래그먼트 금지 플래그 • 도중의 라우터에서 프래그먼트해서 좋은가 어떤가를 지시 • 0 : 프래그먼트 가능 1: 프래그먼트 금지 • MF(More Fragments) : 추가 프래그먼트 플래그 • 이동하는 데이터가 프래그먼트 도중인가 마지막인가를 나타냄 • 0: 마지막 프래그먼트(또는 프래그먼트하지 않음) • 1: 도중의 프래그먼트(후속 프래그먼트가 존재) • 프래그먼트 오프셋 • 13비트크기의 필드 • 프래그먼트된 데이터가 오리지널 IP 데이터그램의 위치를 의미 • 재생 시간(ip_ttl) • IP 데이터그램이 통과할 수 있는 라우터의 개수 • 라우터를 통과할 때마다 값이 1씩 감소 • 0이 되면 IP 데이타그램은 폐기

  29. IP • 프로토콜 번호(ip_p) • 상위 층의 프로토콜에 대해 나타냄 • 헤더 체크섬(ip_sum) • 16비트의 크기로 IP 헤더의 체크섬을 나타냄 • IP 헤더가 파손되지 않는 것을 보증하기 위한 것

  30. IP • 라우팅 • IP 데이터그램을 목적 호스트까지 보내기 위해서 경로를 선택하는 것

  31. IP • IP 프래그먼트 • 전송이 가능한 최대 프레임의 크기는 데이터 링크로 정해져 있음 • MTU(Maximum Transmission Unit) • Ethernet:1500옥텟 • FDDI: 4352옥텟 • IP over ATM : 9180옥텟 • 데이터 링크보다 큰 IP 데이터그램의 전송은 불가능 • 통신하는 호스트간 서로 다른 데이터 링크로 인해 MTU가 줄어드는 경우 도중에 라우터에서 IP 데이터그램을 분할 • 프래그먼트된 IP 데이타그램은 종착점 호스트에서 리어셈블 처리되어 원래의 IP 데이터그램으로 복원 • IP 데이타그램이 복원 가능한 경우만 상위계층으로 페이로드를 전달

  32. IP • IP 프래그먼트 • 식별자(ID) : 시쟉점 호스트에서 번호가 붙여져 종착점 호스트에 도착할 때까지 그 값이 변하지 않음 • IP 프래그먼트

  33. IP • 프래그먼트의 문제점 • 라우터의 부하 상승 • 라우터의 성능에 따라 통신 성능에 큰 영향을 미침 • 도중의 프래그먼트는 라우터의 부하를 가중 • 도중의 프래그먼트는 가능하더라도 하지 않는 편이 좋음 • 프래그먼트된 IP 데이터그램을 상실했을 때의 전송 효율 저하 • 다수의 프래그먼트 조각중 하나만 상실하면 모든 프래그먼트를 삭제 • IP 네트워크는 30초동안 버퍼에 프래그먼트 조각들을 저장 • 30초 후에 모든 프래그먼트가 도착지 않으면 모든 프래그먼트를 삭제 • 해결 방안 • 가능한 도중 프래그먼트의 발생을 없애기 위해 미리 분할 • TCP 의 전송 효율의 저하 문제가 발생 • 더 나은 방법을 위해 경로 MTU 탐색을 이용

  34. 경로 MTU 탐색 • 경로 MTU 탐색 • 통신 경로상의 최소 MTU 를 검색하여 그 크기 이하가 되도록 사전에 미리 송신 호스트에서 IP 데이터그램을 구분해서 송신

  35. ICMP • ICMP(Internet Control Message Protocol) • IP 의 기능을 보조하기 위한 프로토콜 • IP 데이터그램의 배송 중에 에러가 발생한 것을 시작점 호스트에 통지 • 비효율적인 라우팅을 행하고 있을 때 라우팅 테이블을 변경하기 위해 사용 • 복수의 형식 • ICMP 헤더는 공용체(하나의 메모리 공간을 공유)로 정의

  36. ICMP • ICMP 에코 요구, 에코 응답 • Ping 명령어로 이용 • 통신하고 싶은 호스트에 ICMP 에코 요구를 보내고, 그 호스트에 ICMP 에코 요구가 도착한 경우 ICMP 응답이 보내져 옴 0 8 16 31 타입 Type Icmp_type 코드 Code Icmp_code 체크섬 Checksum Icmp_cksum 식별자 Identification Icmp_id 시퀀스 번호 Sequence Number Icmp_seq << 패킷 형식 >> 타입 - 8:에코 요구 0:에코 응답 코드 - 0 이 포함 식별자 - 복수의 ping 명령어를 같은 컴퓨터상에서 실행할 때 각각의 송신 패킷과 응답을 식별하는 것 시퀀스 번호 - 몇번째에 icmp 패킷을 보냈는가를 번호로 기입 - 패킷의 손실 여부 확인을 위해 사용 데이터 - 에코 응답으로 에코 요구부분이 돌아옴 - 패킷의 왕복시간을 알수 있음 데이터 Icmp_data Struct icmp{ u_char icmp_type; u_char icmp_code; u_short icmp_cksum; u_short icmp_id; u_short icmp_seq; char icmp_data[1]; }; << 패킷의 구조체 >>

  37. ICMP • ICMP 도달 불능 • 어떤 원인으로 인해 ip 데이터그램이 목표 호스트까지 도달할 수 없는 경우 0 8 16 31 타입 Type Icmp_type 코드 Code Icmp_code 체크섬 Checksum Icmp_cksum 미사용 Icmp_pmvoid 다움의 MTU Next MTU Icmp_nextmut << 패킷 형식 >> 데이터 Icmp_data Struct icmp{ u_char icmp_type; u_char icmp_code; u_short icmp_cksum; u_short icmp_pmvoid; u_short icmp_nextmtu; char icmp_data[1]; }; << 패킷의 구조체 >>

  38. ICMP • 코드 • 체크섬 • ICMP 헤더와 데이터가 정확하다는 것을 보증 • 포인터 : 사용 하지 않음 • MTU 필드 • 코드 4 로만 이용 • MTU 탐색에서 이용되어 다음 데이터 링크의 MTU 값이 포함 • 데이터 • 에러를 발생시켜 IP 데이터그램의 IP 헤더와 이어 8바이트의 데이터가 포함 #define 되어 있는 문자 코드 의미 ICMP_UNREACH_NET 0 네트워크 도달 불능 ICMP_UNREACH_HOST 1 호스트 도달 불능 ICMP_UNREACH_PROTOCOL 2 프로토콜 도달 불능 ICMP_UNREACH_PORT 3 포트 도달 불능 ICMP_UNREACH_NEEDFRAG 4 프래그먼트가 필요하거나 DF 가 세트되어 있다. ICMP_UNREACH_SRCFAIL 5 소스 라우팅 실패

  39. ICMP • ICMP 도달 불능

  40. ICMP • ICMP 리다이렉트 • 라우팅 테이블을 강제적으로 수정하기 위해 송신 타입 Type Icmp_type 코드 Code Icmp_code 체크섬 Checksum Icmp_cksum 라우터의 IP 어드레서 Gateway Internet Address Icmp_gwaddr << 패킷 형식 >> 데이터 (ip 헤더와 거기에 이어지는 64 비트) Icmp_data Struct icmp{ u_char icmp_type; u_char icmp_code; u_short icmp_cksum; struct in_addr icmp_gwaddr char icmp_data[1]; }; << 패킷의 구조체 >>

  41. ICMP • 타입 : 5 • 코드 • 체크섬 • ICMP 의 헤더와 데이터가 정확하다는 것을 보증 • 라우터의 IP 어드레스 • 라우팅 테이블의 전송처에 기술하는 IP 어드레스가 포함 • 데이터 • 리다이렉트가 필요하다고 생각되는 IP 데이터그램의 IP 헤더와 그 뒤 8바이트의 데이터가 포함 #define 되어 있는 문자 코드 의미 ICMP_UNREACH_NET 0 네트워크 도달 불능 ICMP_UNREACH_HOST 1 호스트 도달 불능 ICMP_UNREACH_PROTOCOL 2 프로토콜 도달 불능 ICMP_UNREACH_PORT 3 포트 도달 불능 ICMP_UNREACH_NEEDFRAG 4 프래그먼트가 필요하거나 DF 가 세트되어 있다. ICMP_UNREACH_SRCFAIL 5 소스 라우팅 실패

  42. ICMP • ICMP 리다이렉트

  43. ICMP • ICMP 시간 초과 메시지 • IP 헤더의 TTL 의 값이 0 이 되었을 때 또는 프래그먼트화된 패킷을 리어셈블하지 못하고 폐기할때 전송 타입 Type Icmp_type 코드 Code Icmp_code 체크섬 Checksum Icmp_cksum 미사용 Icmp_void << 패킷 형식 >> 데이터 (ip 헤더와 거기에 이어지는 64 비트) Icmp_data Struct icmp{ u_char icmp_type; u_char icmp_code; u_short icmp_cksum; n_int icmp_void; char icmp_data[1]; }; << 패킷의 구조체 >>

  44. ICMP • 타입 : 11 • 코드 • 0 : TTL 이 0으로 된 데이터그램을 폐기하는 것 • 1 : 프래그먼트의 리어셈블이 타임아웃해서 데이터그램이 폐기되는 것 • IP 데이터그램이 폐기된 것을 시작점 호스트에서 전달 • 체크섬 • ICMP 의 헤더와 데이터가 바르다는 것을 보증 • 포인터 : 사용 안함 • 데이터 • 에러를 발생시킨 IP 데이터그램의 IP 헤더와 이어진 8바이트의 데이터

  45. ICMP • 공용체와 실제의 ICMP 헤더 구조체 #define icmp_pptr icmp_hun.ih_pptr #define icmp_gwaddr icmp_hun.ih_gwaddr #define icmp_id icmp_hun.ih_idseq.icd_id #define icmp_seq icmp_hun.ih_idseq.icd_seq #define icmp_void icmp_hun.ih_void #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void #define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu #define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs #define icmp_wpa icmp_hun.ih_rtradv.irt_wpa #define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime struct icmp{ u_char icmp_type; u_char icmp_code; u_short icmp_cksum; union{ u_char ih_pptr; struct in addr ih_gwaddr; struct ih_idseq{ n_short icd_id; n_short icd_seq; } ih_idseq; int ih_void; struct ih_pmtu{ n_short ipm_void; n_short ipm_nextmtu; } ih_pmtu; struct ih_rtradv{ u_char irt_num_addrs; u_char irt_wpa; u_int16_t irt_lifetime; }ih_rtradv; }icmp_hun; 공용체를 이용하면 멤버를 찾게 되고 프로그램중에 피리어드가 증가되고 프로그램이 알기 어렵게 되기 때문에 define 을 사용하여 멤버를 줄이도록 정의

  46. ICMP union{ struct id_ts{ n_time its_otime; n_time its_rtime; n_time its_ttime; }id_ts; struct id_ip{ struct ip idi_ip; }id_ip; struct icmp_ra_addr id_radv; u_int32_t id_mask; char id_data[1]; } icmp_dun; #define icmp_otime icmp_dun.id_ts.its_otime #define icmp_rtime icmp_dun.id_ts.its_rtime #define icmp_ttime icmp_dun.id_ts.its_ttime #define icmp_ip icmp_dun.id_ip.idi_ip #define icmp_radv icmp_dun.id_radv #define icmp_mask icmp_dun.id_mask #define icmp_data icmp_dun.id_data 공용체를 이용하면 멤버를 찾게 되고 프로그램중에 피리어드가 증가되고 프로그램이 알기 어렵게 되기 때문에 define 을 사용하여 멤버를 줄이도록 정의

  47. UDP(User Datagram Protocol) • UDP • IP 의 기능을 그대로 애플리케이션으로 이용하기 위해 만들어진 프로토콜 • IP 포트 번호와 체크섬 기능을 추가 • 커넥션리스 • 신뢰성 없는 데이터그램형의 서비스를 제공 • 헤더 0 16 31 struct udphdr { u_short uh_sport; /* source port */ u_short uh_dport; /* destination port */ u_short uh_ulen; /* udp length */ u)short uh_sum; /* udp checksum */ }; 종착점 포트 번호 Destination Port Uh_dport 시작점 포트 번호 Source Port Uh_sport 패킷 길이 Length Uh_ulen 체크섬 Checksum Uh_sum << 헤더의 포맷 >> << UDP 헤더의 구조체 >> • 시작점 포트 번호와 종착점 포트 번호 : 각각의 포트 번호 • 패킷 길이 : UDP 헤더의 길이와 데이터의 길이가 포함 • 체크섬 : UDP 헤더와 데이터의 신뢰성을 제공하기 위한 필드

  48. TCP • TCP • IP의 기능을 확장해 종착점 호스트 사이에 신뢰성 있는 통신을 제공 • 커넥션 지향의 프로토콜(통신시 커넥션을 연결,통신의 종료시 커넥션을 끊음) • 송신 데이터의 순서 번호 제어와 그에 대한 확인 응답 제어 • TCP 세그먼틔의 길이를 나타내는 필드가 없음 • IP 헤더의 패킷 길이로부터 구해지기 때문 시작점 포트 번호와 종착점 포트 번호 :각각의 포트번호를 나타냄 시퀀스 번호 통신한 데이터의 위치를 옥텟 단위로 표현 확인 응답 번호 다음에 송신한 시퀀스 번호 데이터 오프셋 TCP가 이동하고 있는 데이터 헤더의 선두에서 계산되는 것이 어디서부터 시작하는지를 나타냄 1단위는 4 옥텟, 옵션이 포함되지 않을 경우 5 가 저장 플래그 6 비트는 제어 플래그 윈도 사이즈 데이터를 수신하는 측의 수신 버퍼의 빈영역의 크기를 알려주는데 사용 체크섬 TCP의 헤더나 데이터가 포함되어 있지 않을 것을 보증 긴급포인터 제어 플래그의 URG 가 1인 경우 유효 긴급을 요하는 데이터의 보관 장소를 나타낸 포인터로 처리 시작점 포트 번호 Source Port Th_sport 종착점 포트 번호 Destination Port Th_dport 시퀀스 번호 Sequence Number Th_seq 확인 응답 번호 Acknoledgement Number Th_ack 오프셋 Data Offset Th_off 플래그 Flags Th_flags 윈도 크기 Urgent Pointer Th_urp 체크섬 Checksum Th_sum 긴급 포인터 Urgent Pointer Th_urp

  49. TCP • 제어 플래그 제어플프래그의 의미 플래그 비트가 1일 때의 의미 URG(Urgent Flag) 이동하고 있는 데이터 중에 긴급히 처리해야 하는 것이 포함되어 있는지 아닌지를 의미 긴급히 처리해야 하는 데이터는 긴급 포인터의 필드에 나타남 ACK(Acknowledgement Flag) 확인 응답 필드가 유효한 것을 의미 가장 최초의 SNY 세그먼트 이외는 반드시 [1]로 되어 있음 PSH(Push Flag) 송신한 데이터를 버퍼링하지 않게 신속히 애플리케이션에 전해 주도록 지원 RST(Reset Flag) 커넥션을 강제적으로 차단하는 것을 의미 SYNC(Syncronize Flag) 커넥션 연결 요구를 의미 시퀀스 번호 필드의 값을 시퀀스 번호의 초기값으로 함 FIN(Fin Flag) 커넥션 차단 요구를 의미 통신의 마지막 세그먼트에 있는 것을 의미 이 세그먼트 외에는 데이터 세그먼트가 전송되지 않음

  50. TCP • TCP 커넥션의 연결 및 차단

More Related