Top Banner
2/15/10 Dr. Tim Lin ECE Department Cal Poly Pomona EXIT >
36

Dr. Tim Lin ECE Department Cal Poly Pomona

Mar 15, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Dr. Tim Lin ECE Department Cal Poly Pomona

2/15/10

Dr. Tim Lin ECE Department Cal Poly Pomona

EXIT >

Page 2: Dr. Tim Lin ECE Department Cal Poly Pomona

Agenda •  What is Computer Network •  ISO / OSI model •  Internet Organizations •  IP Addresses

–  v4 •  Classful •  Classless

–  V6 •  IP Protocol

–  Header •  ICMP Protocol •  ARP Protocol

•  UDP Protocol •  TCP Protocol

–  Header –  Flow Control –  Error Control –  Congestion Control

•  FTP Protocol •  HTTP Protocol •  SMTP Protocol •  Network Commands •  Technology (LAN)

Page 3: Dr. Tim Lin ECE Department Cal Poly Pomona

2/15/10

EXIT OSI > <

•  The transmission mechanism at the network layer

•  Unreliable connectionless datagram protocol

Page 4: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 7.1 Position of IP in TCP/IP protocol suite

Page 5: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 7.2 IP datagram

Page 6: Dr. Tim Lin ECE Department Cal Poly Pomona
Page 7: Dr. Tim Lin ECE Department Cal Poly Pomona

Tools to Analyze IP Packet

•  Wireshark – http://www.wireshark.org – Download From Dr. Rich’s CS499 site

•  Ethereal – http://www.ethereal.com

Page 8: Dr. Tim Lin ECE Department Cal Poly Pomona

Run Wireshark

Page 9: Dr. Tim Lin ECE Department Cal Poly Pomona

Check Frame 253 an ICMP frame (which is an IP frame)

Page 10: Dr. Tim Lin ECE Department Cal Poly Pomona

Analyze Frame 253

Page 11: Dr. Tim Lin ECE Department Cal Poly Pomona

First 12 bytes: Ethernet dest and rc physical addresses

Page 12: Dr. Tim Lin ECE Department Cal Poly Pomona
Page 13: Dr. Tim Lin ECE Department Cal Poly Pomona

Analyze 74 bytes of IP data

•  0000 00 06 25 8f ac 55 00 0f 1f 4f 21 7a 08 00 45 00 ..%..U.. .O!z..E. •  0010 00 3c b5 f2 00 00 80 01 ca f6 c0 a8 01 6e 62 89 .<...... .....nb. •  0020 95 38 08 00 30 5c 02 00 1b 00 61 62 63 64 65 66 .8..0\.. ..abcdef •  0030 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 ghijklmn

opqrstuv •  0040 77 61 62 63 64 65 66 67 68 69 wabcdefg hi

IP Version 4

Header length = 5 * 4 = 20

Total length = 0x3c = 60 decimal. Frame = 14

ethernet + 60 IP

Protocol = 1 meaning ICMP from

chart 6

Page 14: Dr. Tim Lin ECE Department Cal Poly Pomona
Page 15: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 8.25 Example of checksum calculation in hexadecimal

Page 16: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 9.1 Position of ICMP in the network layer

Page 17: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 9.2 ICMP encapsulation

Page 18: Dr. Tim Lin ECE Department Cal Poly Pomona
Page 19: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 9.3 General format of ICMP messages

Page 20: Dr. Tim Lin ECE Department Cal Poly Pomona

Analyze 74 bytes of ICMP data

•  0000 00 06 25 8f ac 55 00 0f 1f 4f 21 7a 08 00 45 00 ..%..U.. .O!z..E. •  0010 00 3c b5 f2 00 00 80 01 ca f6 c0 a8 01 6e 62 89 .<...... .....nb. •  0020 95 38 08 00 30 5c 02 00 1b 00 61 62 63 64 65 66 .8..0\.. ..abcdef •  0030 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 ghijklmn

opqrstuv •  0040 77 61 62 63 64 65 66 67 68 69 wabcdefg hi

IP Version 4

Header length = 5 * 4 = 20

Total length = 0x3c = 60 decimal. Frame = 14

ethernet + 60 IP

Protocol = 1 meaning ICMP from

chart 6

ICMP Type = 8 or echo request, agreeing with chart 9

Underlined data: ICMP data section

Ethernet type 0800

Page 21: Dr. Tim Lin ECE Department Cal Poly Pomona

C code of ping (ICMP) •  // •  // Ping.h •  //

•  #pragma pack(1)

•  #define ICMP_ECHOREPLY 0 •  #define ICMP_ECHOREQ 8

•  // IP Header -- RFC 791 •  typedef struct tagIPHDR •  { •  u_char VIHL; // Version and IHL •  u_char TOS; // Type Of Service •  short TotLen; // Total Length •  short ID; // Identification •  short FlagOff; // Flags and Fragment Offset •  u_char TTL; // Time To Live •  u_char Protocol; // Protocol •  u_short Checksum; // Checksum •  struct in_addr iaSrc; // Internet Address - Source •  struct in_addr iaDst; // Internet Address - Destination •  }IPHDR, *PIPHDR;

Check IP Header (chart 5)

Page 22: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping.h •  // ICMP Header - RFC 792 •  typedef struct tagICMPHDR •  { •  u_char Type; // Type •  u_char Code; // Code •  u_short Checksum; // Checksum •  u_short ID; // Identification •  u_short Seq; // Sequence •  char Data; // Data •  }ICMPHDR, *PICMPHDR;

•  #define REQ_DATASIZE 32 // Echo Request Data size

•  // ICMP Echo Request •  typedef struct tagECHOREQUEST •  { •  ICMPHDR icmpHdr; •  DWORD dwTime; •  char cData[REQ_DATASIZE]; •  }ECHOREQUEST, *PECHOREQUEST;

•  // ICMP Echo Reply •  typedef struct tagECHOREPLY •  { •  IPHDR ipHdr; •  ECHOREQUEST echoRequest; •  char cFiller[256]; •  }ECHOREPLY, *PECHOREPLY;

•  #pragma pack()

Page 23: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping.c (prelude) •  // •  // PING.C -- Ping program using ICMP and RAW Sockets •  //

•  #include <stdio.h> •  #include <stdlib.h> •  #include <winsock.h>

•  #include "ping.h"

•  // Internal Functions •  void Ping(LPCSTR pstrHost); •  void ReportError(LPCSTR pstrFrom); •  int WaitForEchoReply(SOCKET s); •  u_short in_cksum(u_short *addr, int len);

•  // ICMP Echo Request/Reply functions •  int SendEchoRequest(SOCKET, LPSOCKADDR_IN); •  DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *);

Page 24: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping.c main function •  // main() •  void main(int argc, char **argv) •  { •  WSADATA wsaData; •  WORD wVersionRequested = MAKEWORD(1,1); •  int nRet;

•  // Check arguments •  if (argc != 2) •  { •  fprintf(stderr,"\nUsage: ping hostname\n"); •  return; •  }

•  // Init WinSock •  nRet = WSAStartup(wVersionRequested, &wsaData); •  if (nRet) •  { •  fprintf(stderr,"\nError initializing WinSock\n"); •  return; •  }

•  // Check version •  if (wsaData.wVersion != wVersionRequested) •  { •  fprintf(stderr,"\nWinSock version not supported\n"); •  return; •  }

•  // Go do the ping •  Ping(argv[1]);

•  // Free WinSock •  WSACleanup(); •  }

Page 25: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping function first part •  void Ping(LPCSTR pstrHost) •  { •  SOCKET rawSocket; •  LPHOSTENT lpHost; •  struct sockaddr_in saDest; •  struct sockaddr_in saSrc; •  DWORD dwTimeSent; •  DWORD dwElapsed; •  u_char cTTL; •  int nLoop; •  int nRet;

•  // Create a Raw socket •  rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); •  if (rawSocket == SOCKET_ERROR) •  { •  ReportError("socket()"); •  return; •  } •  •  // Lookup host •  lpHost = gethostbyname(pstrHost); •  if (lpHost == NULL) •  { •  fprintf(stderr,"\nHost not found: %s\n", pstrHost); •  return; •  } •  •  // Setup destination socket address •  saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr)); •  saDest.sin_family = AF_INET; •  saDest.sin_port = 0;

•  // Tell the user what we're doing •  printf("\nPinging %s [%s] with %d bytes of data:\n", •  pstrHost, •  inet_ntoa(saDest.sin_addr), •  REQ_DATASIZE);

Page 26: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping function part II •  // Ping multiple times •  for (nLoop = 0; nLoop < 4; nLoop++) •  { •  // Send ICMP echo request •  SendEchoRequest(rawSocket, &saDest);

•  // Use select() to wait for data to be received •  nRet = WaitForEchoReply(rawSocket); •  if (nRet == SOCKET_ERROR) •  { •  ReportError("select()"); •  break; •  } •  if (!nRet) •  { •  printf("\nTimeOut"); •  break; •  }

•  // Receive reply •  dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);

•  // Calculate elapsed time •  dwElapsed = GetTickCount() - dwTimeSent; •  printf("\nReply from: %s: bytes=%d time=%ldms TTL=%d", •  inet_ntoa(saSrc.sin_addr), •  REQ_DATASIZE, •  dwElapsed, •  cTTL); •  } •  printf("\n"); •  nRet = closesocket(rawSocket); •  if (nRet == SOCKET_ERROR) •  ReportError("closesocket()"); •  }

Page 27: Dr. Tim Lin ECE Department Cal Poly Pomona

Send Echo Request •  // SendEchoRequest() •  // Fill in echo request header •  // and send to destination •  int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr) •  { •  static ECHOREQUEST echoReq; •  static nId = 1; •  static nSeq = 1; •  int nRet;

•  // Fill in echo request •  echoReq.icmpHdr.Type = ICMP_ECHOREQ; •  echoReq.icmpHdr.Code = 0; •  echoReq.icmpHdr.Checksum = 0; •  echoReq.icmpHdr.ID = nId++; •  echoReq.icmpHdr.Seq = nSeq++;

•  // Fill in some data to send •  for (nRet = 0; nRet < REQ_DATASIZE; nRet++) •  echoReq.cData[nRet] = ' '+nRet;

•  // Save tick count when sent •  echoReq.dwTime = GetTickCount();

•  // Put data in packet and compute checksum •  echoReq.icmpHdr.Checksum = in_cksum((u_short *)&echoReq, sizeof(ECHOREQUEST));

•  // Send the echo request

•  nRet = sendto(s, /* socket */ •  (LPSTR)&echoReq, /* buffer */ •  sizeof(ECHOREQUEST), •  0,

/* flags */ •  (LPSOCKADDR)lpstToAddr, /* destination */ •  sizeof(SOCKADDR_IN)); /* address length */

•  if (nRet == SOCKET_ERROR) •  ReportError("sendto()"); •  return (nRet); •  }

Page 28: Dr. Tim Lin ECE Department Cal Poly Pomona

Receive Echo Reply •  // Receive incoming data •  // and parse out fields •  DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) •  { •  ECHOREPLY echoReply; •  int nRet; •  int nAddrLen = sizeof(struct sockaddr_in);

•  // Receive the echo reply •  nRet = recvfrom(s, // socket •  (LPSTR)&echoReply, // buffer •  sizeof(ECHOREPLY), // size of buffer •  0,

// flags •  (LPSOCKADDR)lpsaFrom, //

From address •  &nAddrLen); //

pointer to address len

•  // Check return value •  if (nRet == SOCKET_ERROR) •  ReportError("recvfrom()");

•  // return time sent and IP TTL •  *pTTL = echoReply.ipHdr.TTL; •  return(echoReply.echoRequest.dwTime); •  }

Page 29: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping.c: Report Error •  // What happened? •  void ReportError(LPCSTR pWhere) •  { •  fprintf(stderr,"\n%s error: %d\n", •  WSAGetLastError()); •  }

•  // WaitForEchoReply() •  // Use select() to determine when •  // data is waiting to be read •  int WaitForEchoReply(SOCKET s) •  { •  struct timeval Timeout; •  fd_set readfds;

•  readfds.fd_count = 1; •  readfds.fd_array[0] = s; •  Timeout.tv_sec = 5; •  Timeout.tv_usec = 0;

•  return(select(1, &readfds, NULL, NULL, &Timeout)); •  }

Page 30: Dr. Tim Lin ECE Department Cal Poly Pomona

Ping.c Checksum •  // •  // Mike Muuss' in_cksum() function •  // and his comments from the original •  // ping program •  // •  // * Author - •  // * Mike Muuss •  // * U. S. Army Ballistic Research Laboratory •  // * December, 1983

•  /* •  * I N _ C K S U M •  * •  * Checksum routine for Internet Protocol family headers (C Version) •  * •  */

•  u_short in_cksum(u_short *addr, int len) •  { •  register int nleft = len; •  register u_short *w = addr; •  register u_short answer; •  register int sum = 0;

•  /* •  * Our algorithm is simple, using a 32 bit accumulator (sum), •  * we add sequential 16 bit words to it, and at the end, fold •  * back all the carry bits from the top 16 bits into the lower •  * 16 bits. •  */ •  while( nleft > 1 ) { •  sum += *w++; •  nleft -= 2; •  }

•  /* mop up an odd byte, if necessary */ •  if( nleft == 1 ) { •  u_short u = 0;

•  *(u_char *)(&u) = *(u_char *)w ; •  sum += u; •  }

•  /* •  * add back carry outs from top 16 bits to low 16 bits •  */ •  sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ •  sum += (sum >> 16); /* add carry */ •  answer = ~sum; /* truncate to 16 bits */ •  return (answer); •  }

Page 31: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 8.1 Position of ARP in TCP/IP protocol suite

Page 32: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 8.2 ARP operation

Page 33: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 8.3 ARP packet

Page 34: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 8.5 Four cases using ARP

Page 35: Dr. Tim Lin ECE Department Cal Poly Pomona

Figure 8.6 Example 8.1

Note Ethernet Type bytes are 0806 for ARP, different from IP

packet of 0800

Page 36: Dr. Tim Lin ECE Department Cal Poly Pomona

ARP Reply Frame

Did you see 0806 in ethernet type?