hufs mclab c hapter 22 protocol control blocks hufs ice 200530032 김 영 준 [email protected]...
TRANSCRIPT
hufs MCLABhufs MCLAB
Chapter 22
Protocol Control Blocks
HUFS ICE 200530032
김 영 준[email protected]
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( )