Raw Socket

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Introduction!

Overview!
! Last Lecture!
! Advanced UDP sockets and threads!
! Source: Chapters 22&26 of Stevens book!

! This Lecture!
! Signal-driven I/O, Raw sockets!
! Source: Chapters 25&28&29 of Stevens book!

! Kernel notifies a process with a signal when


something happens on a descriptor.!
! SIGIO!
! POSIX provides true asynchronous I/O with
aio_XX functions.!

! Next Lecture!
! WSN and revision!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 1

Signal-driven I/O for Sockets!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 2

Two different UDP servers!

! To use signal-driven I/O with sockets:!


! Establish a signal handler for the SIGIO signal!
! Set the socket owner with the F_SETOWN
command of fcntl!
! Turn on the O_ASYNC flag with the F_SETFL
command of fcntl to enable signal-driven I/O!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 3

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 4

Example!

Raw Sockets!

! Data structures for received datagrams and


their socket address structures!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 5

! Raw sockets provide three capabilites!


! Read and write ICMPv4, IGMPv4, and
ICMPv6 packets!
! Read and write IPv4 datagrams with an IPv4
protocol field that is not processed by the kernel!
! With a raw socket, a process can build its own
IPv4 header, using the IP_HDRINCL socket
option!

Raw Socket Creation 1!

Raw Socket Creation 2!

! Steps are:!
int sockfd;!
sockfd = socket(AF_INET, SOCK_RAW, protocol);!
const int on = 1;!
if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL,!
&on, sizeof(on)) < 0)!
error!

! protocol is one of the constants IPPROTO_xxx defined


in netinet/in.h, such as IPPROTO_ICMP!
! Only the superuser can create a raw socket!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 7

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 6

! bind can be called on the raw socket, but


this is rare. A raw socket can only be bound
to a local address, not a port number. !
! connect can be called on the raw socket, but
this is rare. It only sets the foreign address
and allows us to use write or send instead of
sendto.!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 8

Raw Socket Output 1!

Raw Socket Output 2!


! If IP_HDRINCL is set, the starting address of the
data for the kernel to write specifies the first byte
of IP header. !

! Performed by calling sendto or sendmsg


with the destination IP address!
! write or send if the socket is connected!

! The amount of data to write must include the size of the


IP header.!
! The process builds the entire IP header, except:!

! If IP_HDRINCL is not set, the starting


address of the data for the kernel to send
specifies the first byte following the IP
header!

! the IPv4 identification field can be 0 which tells kernel to set


the value!
! kernel always calculates and stores header checksum!
! IP options may or may not be included!

! Kernel will build the IP header and prepend it


to the data!
! Protocol field from protocol in socket call!
TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 9

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 10

Raw Socket Input 1!

Raw Socket Output 3!


! The kernel fragments raw packets that exceed the
outgoing interface MTU!
! With IPv4, the process must calculate and set any
payload checksums contained in whatever follows
the IPv4 header, e.g. ICMPv4 checksum.!
! With IPv6, the checksum for ICMPv6 is
calculated by the kernel.!

! Which datagrams does the kernel pass to


raw sockets?!
! Never pass UDP/TCP packets!
! Most ICMP packets after the kernel has
finished processing the ICMP message!
! All IGMP packets after the kernel has finished
processing the IGMP message!
! All IP datagrams with a protocol field that the
kernel does not understand!

! If fragmented, kernel reassembles before


passing datagram to raw socket!
TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 11

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 12

Raw Socket Input 2!

Raw socket input 3!

! When the kernel has an IP datagram to pass to the raw


sockets, a copy of the IP datagram is delivered to each
matching socket (if all three tests are true)!
! If a nonzero protocol is specified when the raw socket is created,
the protocol field of the IP datagram must match the sockets
protocol!
! If bind is called, destination address of the datagram must match
the sockets bound address!
! If connect is called, source address of the datagram must match the
sockets connected address!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 13

Ping!

! For a raw IPv6 socket, only the payload is passed to the socket!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 14

Traceroute!
! How to make a traceroute program?!

! How to make a ping program?!

! Create two sockets, one is SOCK_DGRAM, the other


is SOCK_RAW!
! The SOCK_DGRAM socket is used to send IP
datagrams with TTL starting from 1!

! A raw socket is created for ICMP protocol!


! The main function is receiving IP datagrams in
a loop!
! When a datagram is received, the sequence number
and calculated RTT are printed out.!

! time exceeded in transit ICMP errors will result until TTL is


large enough!

! An alarm is set every second and the


SIGALRM signal handler sends an ICMP
packet with a sequence number and a
timestamp!

! The SOCK_RAW is used to receive ICMP packets!


! Send a datagram, and then wait to receive an ICMP
packet!
! Repeat the above until port unreachable ICMP packet
received.!

! The checksum of the ICMP packet is calculated!


TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 15

! If a raw socket is created with a protocol 0, and neither


bind nor connect is called, then that socket receives a copy
of every raw datagram the kernel passes to raw sockets!
! Whenever a datagram is passed to a raw IPv4 socket, the
entire datagram including IP header is passed to it!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 16

ICMP Daemon 1!

ICMP Daemon 2!

! Allow applications to receive asynchronous ICMP


errors in detail (refer to the directory icmpd)!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 17

ICMP Daemon 3!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 19

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 18

ICMP Daemon 4!

TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 20

Datalink Access!
! Datalink access provides the following
capabilities!
! The ability to watch the packets received by the
datalink layer, allowing programs such as
tcpdump to be run on normal computer systems!
! The ability to run certain programs as normal
applications instead of as part of the kernel, e.g.
RARP server.!
! Linux uses PF_PACKET as the domain for
sockets to support datalink access!
TELE 402 Lecture 13: Signal-Driven I/O & Raw Socket 21

You might also like