hufs mclab c hapter 22 protocol control blocks hufs ice 200530032 김 영 준 ddanggae@hufs.ac.kr...

Post on 12-Jan-2016

229 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

hufs MCLABhufs MCLAB

Chapter 22

Protocol Control Blocks

HUFS ICE 200530032

김 영 준ddanggae@hufs.ac.kr

TCP/IP Illustrated, Volume 2TCP/IP Illustrated, Volume 2

hufs MCLABhufs MCLAB

Contents Introduction Code Introduction inpcb{} Structure in_pcballoc( ) and in_pcbdetach( ) Functions Binding, Connecting, and Demultiplexing in_pcblookup( ) Function in_pcbbind( ) Function in_pcbconnect( ) Function in_pcbdisconnect( ) Function in_setsockaddr( ) and in_setpeeraddr( ) Functions in_pcbnotify( ) , in_rtchange( ) , and in_losing( ) Functions Summary

hufs MCLABhufs MCLAB

Introduction Protocol Control Block 은 UDP, TCP socket 에 필요한

정보들을 저장 Internet Protocol 은 Internet protocol control block 과 TCP control

block 을 유지 UDP 는 connectionless 이기 때문에 유지 X (UDP control block X)

Foreign, Local IP address and port, IP header proto type, IP option, routing table entry, TCP control block state information

hufs MCLABhufs MCLAB

File Type DTYPE_SOCKETSocket Type

SOCK_DGRAMSOCK_STREAM

Protocol layer called inpcb{} 를 만들어서 socket{} 연결

TCP tcpcb{} 생성 inp_ppcb 와 t_inpcb 연결UDP null pointer

Socket pair 들로부터 ip addr, port 입력

Internet PCB 는 double linked listHead 는 gloval inpcb structure (udb , tcp)3 개의 member, lport 는 후에 단명포트로 ..

Internet PCBInternet PCB 는 는 transport layer data structuretransport layer data structure Used by TCP, UDP, raw IPUsed by TCP, UDP, raw IP Not by IP, ICMP, IGMPNot by IP, ICMP, IGMP

hufs MCLABhufs MCLAB

Code Introduction Source

Global Variables

Kernel’s malloc function 에 의해서 PCBs 할당 Type of M_BUF , socket structure 는 M_SOCKET

hufs MCLABhufs MCLAB

inpcb Structure

struct route inp_route Foreign address 로 가는 route 의 주소를 inp_route entry 에 저장

Double Linked ListHead 를 가리키는 pointerUDP list udp , TCP list tcp

Network Byte OrderTransport Layer 마다 port number 저장 XTCP 의 경우 tcpcb 에 속해있다

User output 의 경우 kernel start,Socket layer 에 대응하는 Internet PCB 연결

Processing a received IP datagram 의 경우Kernel start, PCB 에 대응하는 Socket Structure 와 연결

hufs MCLABhufs MCLAB

inp_flags member

struct ip inp_ip Copy of IP header, but only used by TOS and TTL

TOS is initialized to 0 TTL is initialized by transport layer(default TTL to 64) IP_TOS or IP_TTL socket option 사용으로 변경하면 새로운 값은 in

pcb.inp_ip struct 에 저장 TCP, UDP 는 이 structure 를 사용하고 , prototype IP header 처럼 I

P datagram 을 전송할 때 사용한다 .

hufs MCLABhufs MCLAB

struct mbuf *inp_options IP_OPTIONS socket option 은 출발지 route 를 설정할 때 사용 IP_OPTIONS socket option 을 사용해서 process 는 datagram 을

outgoing ip_pcbopts() 에 의해서 mbuf 안에 option 의 copy 가 저장 , point

er 는 mbuf 를 가리킨다 .

struct ip_moptions *inp_moptions User’s IP multicast option 에 대한 pointer

hufs MCLABhufs MCLAB

in_pcballoc( ) and in_pcbdetach( ) Functions Internet PCB is allocated by TCP, UDP, raw IP

when a socket is created. PRU_ATTACH request 은 socket system call 에 의해 나타남 .

60-70 Allocate PCB and initialize to zero PCB 안에서 IP, port number 가 0 로 initialize 되야 하므로 ..

71-74 Link Structures together insque(inp, head); 새로운 PCB inp 를 double linked list

hufs MCLABhufs MCLAB

288-300 socket structure 안의 PCB pointer 를 0 으로 set sofree(so) struct socket release If mbuf 에 IP options 이 있으면 release by m_free() If route is held by this PCB, release by rtfree() multicast options are also release by ip_freemoptions()

301-302 Double linked list 에서 PCB 제거 Kernel 에 할당된 memory 를 FREE()

hufs MCLABhufs MCLAB

Binding, Connecting, and Demultiplexing Binding of Local IP Address and Port Number

PCB 에 local port 가 존재하기 때문에 EADDRINUSE error 만약 포트를 사용한다면 ..

SO_REUSEADDR SO_REUSEPORT

Connecting a UDP Socket TCP client 뿐만 아니라 , UDP client, server 도 가능 Socket 을 특정한 peer 만 UDP datagram 을 교환하도록 제한

hufs MCLABhufs MCLAB

Demultiplexing of Received IP Datagrams by TCP

TCP 는 in_pcblookup() 을 통해서 Internet PCB 의 list 에서 matching 되는 port 를 찾아서 segment 를 receive

Match 0, 1 (local IP or foreign IP), 2 (both local IP and foreign IP) 이때 wildcard match 를 한다 . Wildcard match 최소값을 match Incoming segment from {140.252.1.11:1500} to {140.252.1.29:23}

Incoming segment from {140.252.1.11:1501} to {140.252.1.29:23}

Match ??

hufs MCLABhufs MCLAB

Demultiplexing of Received IP Datagrams by UDP 1. Broadcast, Multicast IP address 로 들어오는 UDP datagram 에

대해서 모두 socket 에 matching 한다 . 2. Unicast IP address 로 들어오는 UDP datagram 에 대해서는

오직 하나의 socket 에 matching 한다 . 이때 최소값의 wildcard match 를 적용

Received datagram from {140.252.13.34:1500} to {140.252.13.63:577}

Received datagram from {140.252.1.11:1500} to {140.252.1.29:577}

hufs MCLABhufs MCLAB

in_pcblookup( ) Function The function in_pcblookup serves four different purposes

1. TCP or UDP 가 IP datagram 을 받을 때 , in_pcblookup() 은 Internet PCBs 의 protocol’s list 를 scan, PCB 에 matching 되는 datagram 을 receive. Transport layer demultiplexing of received datagram

2. Process 가 bind() system call 에 의해서 실행될 때 , local IP addr, local port 를 할당 , 이때 in_pcbbind 는 protocol 에 의해 call하고 , 요청된 local addr pair 가 이미 할당되는지를 확인

3. Process 가 bind() system call 에 의해서 실행될 때 , 요청한 ephemeral port 가 socket 에 할당 , kernel 은 in_pcbbind 에 의해 사용 가능한 port 인지 확인 , 만약 사용하고 있다면 next ephemeral port 를 할당 , 할당될 때 까지

4. Process 가 connect() system call 에 의해서 실행될 때 , in_pcbbind() 는 요청된 socket pair 가 unique 한지 확인

in_pcbbind() call in_pcblookup

hufs MCLABhufs MCLAB

Two options confuse the logic of the function

1. SO_REUSEADDR or SO_REUSEPORT socket option은 중복된 local address 를 허용

2. Wildcard match OK 는 socket 이 다른 local interface에 도착하는 UDP datagram 을 accept 하는 것을 의미하고 , Wildcard match 를 금하는 경우는 foreign IP address and port number 로 connecting 했을 때를 말함

hufs MCLABhufs MCLAB

Compare local port numberCompare local address

Compare foreign addressCompare foreign port number

만약 Wildcard 를 사용하지 않으면 loop

Remember best matchreturn if exact macth found

hufs MCLABhufs MCLAB

Example – Demultiplexing of Received TCP Segment

laddr=140.252.1.29 , lport=23 , faddr = 140.252.1.11 , fport=1500

1. First loop Wildcard is 1(foreign IP) matchwild 1 2. Second loop Wildcard is 2(foreign IP,local IP) matchwild 1 3. Third loop Wildcard is 0 matchwild 0

Break;

hufs MCLABhufs MCLAB

in_pcbbind( ) Function Bind a local address and port number to a socket.

1. From bind for a TCP socket (normally to bind a server’s well-known port)

2. From bind for UDP socket (either to bind server’s well-known port or to bind an ephemeral port to a client’s socket)

3. From connect for a TCP socket, if the socket has not yet been bound to a nonzero port (this is typical for TCP clients)

4. From listen for a TCP socket, if the socket has not yet been bound to a nonzero port (this is rare, since listen is called by a TCP server, which normally binds a well-known port, not an ephemeral port)

5. From in_pcbconnect, if the local IP address and local port number have not been set (typical for a call to connect for a UDP socket or for each call to sendto for an unconnected UDP socket)

Implicit bind

Explicit bind

hufs MCLABhufs MCLAB

IP addr 에 assign 되었는지 확인

Wildcard 사용 여부를 확인

nam 이 NULL 이면 implicit bind Non NULL 이면 explicit bind

hufs MCLABhufs MCLAB

Multicast 라면 REUSE 설정 (port)

!INADDR_ANY 인데 interface 가 0면 error

Port 존재하면

Global , all zero addr 로 주소 결정 t = 0 일 때 원하는 addr 를 찾은 경우

사용 가능한 port 결정

hufs MCLABhufs MCLAB

in_pcbconnect( ) Function in_pcbconnect specifies the foreign IP address and port numb

er for a socket.

1. From connect for a TCP socket (required for a TCP client) 2. From connect for a UDP socket (optional for a UDP client,

rare for a UDP server) 3. From sendto when a datagram is output on an unconnected

UDP socket (common) 4. From tcp_input when a connection request (SYN segment)

arrives on a TCP socket that is in the LISTEN state (standard for a TCP server)

hufs MCLABhufs MCLAB

Argument 에 대한 check

Global , Primary IP addr

0.0.0.0 (wildcard) 인지 broadcast 구분

hufs MCLABhufs MCLAB

Route release

Route 가 있으면Route 와 addr 가 다르면DONTROUTE set 이면

DONTROUTE 가 없고 route 경로가 없으면ROUTE 경로 설정

Outgoing interface 결정

loopback 이 아니면

interface addr

현재 지정된 addr

hufs MCLABhufs MCLAB

Multicast 일 경우

Mbuf 의 moptions 가져오고 , multicast addr 을 addr 로 저장

addr 를 route addr 로 저장

socket pair 가 unique 한지 check

Implicit bind

Broadcast 주소 사용가능한 addr 없다는 error

unique 하지 않으면 error

ephemeral port

hufs MCLABhufs MCLAB

in_pcbdisconnect( ) Function

Remove foreign association Foreign IP address to all 0s (INADDR_ANY) Foreign port number to 0

Unconnected UDP socket 에서 datagram 전송 시 Process sendto( ) in_pcbconnect( )

udp_output( ) datagram send in_pcbdisconnect( ) Connected UDP socket 에서 connect 가 call 했을 때

PCB 를 재사용 하기 위해서 284-285 PCB 가 file table 을 더 이상 참조하지 않을 때

(SS_NOFDREF is set) in_pcbdetach( ) release the PCB

hufs MCLABhufs MCLAB

in_setsockaddr( ) and in_setpeeraddr( ) Functions getsockname system call

Local protocol address of a socket PRU_SOCKADDR request Call in_setsockaddr( )

getpeername system call Foreign protocol address PRU_PEERADDR request Call in_setpeeraddr( )

hufs MCLABhufs MCLAB

in_pcbnotify( ) , in_rtchange( ) , and in_losing( ) Functions

Processing of ICMP errorsRoute 경로를 재설정 , All IP datagram 에 영향을 주므로 따로 전달

TCP 에 의해서 호출

ICMP error message

struct protosw{ } 안의 pr_ctlinput entry

source buffer Full

hufs MCLABhufs MCLAB

cmd , dest address family verify

Redirect handlePRC_HOSTDEAD old error, not used

Global array 를 errno value 로후에 notify( ) 의 argument

notify tcp_notify or udp_notify

Call notify function for selected PCBs

hufs MCLABhufs MCLAB

in_rtchange Function

ICMP Errors and UDP Sockets UDP socket 이 connect 가 아니면 application 은 받지 못한다 . Socket 의 foreign IP addr, port 로 제한했기 때문 in_pcbnotify() dst argument 안에 foreign IP addr, port 가

있어야 하는데 , connect UDP 가 아니면 inp_faddr, inp_fport 를 저장 X

UDP socket 은 ICMP error 를 못 받는다 .

ICMP error is redirect 일때 , in_pcbnotify() 가 callPCB 가 route 를 hold 하면 rtfree, 그리고 empty 이 function 에서 route update 하지 않고 ,다음에 PCB 가 사용될 때 new route 가 ip_output 에의해 할당

hufs MCLABhufs MCLAB

in_losing Function

4 번 이상의 retransmission timer 초과 시TCP 에 의해서 호출

Generate routing messagert_addrinfo structure 는 실패한 route 정보로 체워져 있다 .

Delete or release routeRTF_DYNAMIC redirectroute 는 RTM_DELETE 의 요청을 하는rtrequest() 에 의해 delete

hufs MCLABhufs MCLAB

Summary Internet PCB 는 Internet socket(TCP, UDP, raw IP) 관련 All Internet socket 에 공통된 정보를 포함

Local and foreign IP addresses, route structure pointer All PCBs 은 protocol 에 의해서 doubly linked list 로 구성

udp , tcp …

1. in_pcblookup 는 TCP, UDP 에 의해서 call, received datagram 에 대해서 demultiplex, 이때 wildcard match

Also in_pcbbind, in_pcbconnect call 해서 local address, process 가 unique한지 , 또 local,foreign address,process 가 unique 한지 확인

2. in_pcbbind 는 explicitly, implicitly 하게 local address, port 를 bind

explicitly 는 process 가 bind call, implicitly 는 TCP, UDP 가 bind 없이 connect 하거나 sendto call 할 때

3. in_pcbconnect 는 foreign address, port 를 set

local address 가 set 되지 않았다면 foreign address 의 경로에 적합한 local interface 가 local address, local port 가 set 되지 않았다면 in_pcbbind 가 socket 에 ephemeral port 를 선택

hufs MCLABhufs MCLAB

Summary of in_pcbbind( ) and in_pcbconnect( )

top related