TCP/IP Socket Cover Slide 조태문
Socket life cycle Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Active & Passive on TCP Socket 먼저 SYN을 보내는 것을 active-open을 수행한다고 하고 이를 받아 다시 SYN을 보내는 것을 passive-open을 수행한다고 한다 Active-open과 passive-open이 동시에 이루어질 수도 있다. SYN이 서로 교차하면서 연결이 이루어진다는 말이다. 이를 simultaneous-open이라고 한다. 반대 개념으로 simultaneous-close가 있다. 일반적인 Client – server 네트워크 모델에서는 open과 close는 Active – passive로 이루어 진다. 즉 client 측에서 연결 요청을 하고 연결 종료도 클라이언트 측에서 먼저 이루어 진다. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Socket State SYN_SENT : 통신을 하기 위해 최초에 SYN패킷을 보내고 SYN과 ACK of SYN을 기다리는 상태로 3-way handshake의 첫번째 단계, server가 apccet()로 block된 상태에서 client가 connect()을 수행할때 맨처음 패킷이다. SYN_RCVD : SYN_SENT 상태에서 SYN을 받고 ACK of SYN의 패킷을 보낸 상태로 3-way handshake의 두번째 단계. ESTABLISHED : 3-way handshake의 마지막 단계인 ACK를 전송한 후의 양측의 상태로 이 상태에서 데이타 교환을 할 수 있다. 즉 session이 생성된 것. FIN_WAIT1 : active close를 수행(close())후 상태로 FIN Message를 passive close를 수행하여하는 쪽으로 보낸다. FIN_WAIT2 : passive close를 수행하여야 하는 쪽에서 ACK of FIN을 받은 상태이다. 이때 FIN을 다시 받지 못하면 block 상태가 영원히 유지된다. 이를 막기 위해 일반적으로 타이머를 세팅해 두었다가 강제로 끊는다. CLOSE_WAIT : passive close를 수행하여야 하는 쪽이 close() 수행 전까지의 상태. LAST_ACK : passive close를 수행한 쪽에서 다시 FIN을 active close를 수행한 쪽으로 보낸 후에 ACK of FIN을 기다리는 상태. TIME_WAIT(2MSL) : LAST_ACK 상태로 보내는 마지막 ACKfmf 보낸 후 소켓이 소멸되기 직전의 상태. MSL(Maximum Segment Lifetime)이란 이름 그대로, 세그먼트가 네트웍 상에서 돌아다닐 수 있는 최대 시간이며, IP 데이터그램의 TTL과 비슷하다고 보면 된다. 다만 TTL은 시간이 아니라, 홉(노드)을 기준으로 하는 상수값. ack가 하나 drop(유실)되더라도 다시 받을 수 있는 시간이다. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Simultaneous Open 양쪽 모두 Active하게 접속을 하려고 할 때 서로가 SYN을 보내어서 각각 교차해서 연결이 성립 되는 경우를 Simultaneous Open이라고 한다. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
양쪽 모두 Active하게 Close를 시도 Simultaneous Close 양쪽 모두 Active하게 Close를 시도 Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
2MSL State (TIME_WAIT) MSL(Maximum Segment Lifetime)이란 이름 그대로, 세그먼트가 네트웍 상에서 돌아다닐 수 있는 최대 시간이며, IP 데이터그램의 TTL과 비슷하다고 보면 된다. 다만 TTL은 시간이 아니라, 홉(노드)을 기준으로 하는 상수 Active-close를 수행한 경우, 해당 소켓 페어는 MSL 시간의 2배만큼 TIME_WAIT 상태로 머물러야 한다. ACK가 하나 드랍되더라도 다시 받을 수 있는 시간이다.TIME_WAIT 상태에 있는 소켓은 사용할 수 없다. TIME_WAIT 상태에 있는 포트로 날아오는 패킷은 모두 버려진다. TIME_WAIT 상태가 필요한 이유는, 임의의 소켓 페어 접속이 종료된 이후, 소켓 페어가 다시 생성되어 패킷이 왔다갔다할 때, 이전 연결의 지연된 패킷을 새로운 연결의 패킷으로 오인하지 않도록 하기 위해서이다. 그러므로 TIME_WAIT 상태에 있는 소켓 페어는 2MSL만큼의 시간이 지나기 전에는 절대로 재사용할 수 없다. 간략하게 Session을 구분하기 위해 존재한다. 서버에서 SO_REUSEADDR 옵션을 이용해 포트를 재사용할 수 있는 것은 클라이언트가 사용하는 포트가 이전 연결과는 틀리기 때문이다. 소켓 페어의 유일성을 보장하는 것은 어느 한쪽의 주소:포트가 아니라 양쪽 모두의 주소:포트다. 클라이언트와 서버의 역할을 서로 바꾸는 경우 TIME_WAIT 상태에 있는 소켓 페어도 사용할 수 있다. 클라이언트와 서버의 역할을 바꾼다는 말은, 클라이언트 컴퓨터에서 이전 연결에 썼던 자동으로 바인딩된(ephemeral, 한글로 뭐지...) 포트에다 서버를 띄우고, 서버 컴퓨터에서는 반대로 서버 바인딩할 때 썼던 포트를 클라이언트 프로그램 띄우는데 쓴다는 말이다. 클라이언트와 서버의 역할이 바뀌기는 했지만, 소켓 페어는 분명히 TIME_WAIT 상태에 있는데도 불구하고, 연결이 성립된다. Sequence number가 이전 연결에서 쓰던 것보다 새로운 것이라면 연결을 허락한다, Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Server socket의 생성과정1 – socket() 소켓(통신 종단점)을 생성하여 socket의 file descriptor를 반환한다. int socket(int domain, int type, int protocol); domain ( socket address famly ) UNIX : 유닉스 도메인 소켓, IPC용으로 많이 사용됨. INET : TCP/IP 프로토콜을 이용한 인터넷주소 패밀리, 보통의 네트웍프로그래밍시 주로 사용 IPX : 노벨의 IPX 프로토콜 AX25아마추어 라디오 X.25 X25X.25 프로토콜 type SOCK_STREAM ( TCP ) SOCK_DGRAM ( UDP ) SOCK_RAW ( RAW ) protocol 0(IPPROTO_IP) : system defualt protocol 6(IPPROTO_TCP) : tcp 17(IPPROTO_UDP) : user datagram protocol Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Server socket의 생성과정2 – bind() int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); struct sockaddr *my_addr struct sockaddr{ u_short sa_family; char sa_data[14]; }; struct sockaddr_in { short sin_family; // AF_INET u_short sin_port; //네트웍 바이트 오더로 이루어진 포트 번호 struct in_addr sin_addr; // 네트웍 바이트 오더로 이루어진 아이피 번호 char sin_zero[8]; }; Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Server socket의 생성과정3 – listen() int listen(int socket, int backlog); socket : socket file descriptor backlog : 연결이 완료되지 않은 요청 대기열(que)의 갯수. 3-way hand shaking 기법 중 최초의 SYN이 대기하게 된다. Linux 계열의 경우 커널마다 차이가 있지만 주로 해당 값이 아닌 ‘/proc/sys/net/ipv4/tcp_max_syn_backlog’의 값을 참조하여 대기열 크기를 조절한다. 이는 3-way hand shaking의 보완상 취약점인 SYN flooding 공격을 막기 위함. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
socket() 수행 후 Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
listen() 수행 후 Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
accept() 수행 후 Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
close() 수행 전 Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
TIME_WAIT 상태의 Socket에 Bind()가 가능한 소켓으로 속성을 변경한다. setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (int *)&optval, sizeof(optval)); Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Nagle 알고리즘을 사용하지 않도록 설정한다. Socket의 주요 옵션 - 2 Nagle 알고리즘을 사용하지 않도록 설정한다. setsockopt(serv_sock, IPPROTO_TCP, TCP_NODELAY, (int *)&optval, sizeof(optval)); Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Socket의 주요 옵션 - 3 소켓을 닫을 때 전송되지 않은 데이터의 처리 규칙 setsockopt(serv_sock, SOL_SOCKET, SO_LINGER, (int *)&optval, sizeof(optval)); l_onoff == 0 : 이 경우 l_linger의 영향을 받지 않는다. 소켓의 기본설정으로 소켓버퍼에 남아 있는 모든 데이터를 보낸다. 이때 close()는 바로 리턴을 하게 되므로 백그라운드에서 이러한 일이 일어나게 된다. 우아한 연결 종료를 보장한다. l_onoff > 0 and l_linger == 0 : close()는 바로 리턴을 하며, 소켓버퍼에 아직 남아있는 데이터는 버려 버린다. TCP 연결상태일 경우에는 상대편 호스트에 리셋을 위한 RST 패킷을 보낸다. hard 혹은 abortive 종료라고 부른다. l_onoff > 0 and l_linger > 0 : 버퍼에 남아있는 데이터를 모두 보내는 우아한 연결 종료를 행한다. 이때 close()에서는 l_linger에 지정된 시간만큼 블럭상태에서 대기한다. 만약 지정된 시간내에 데이터를 모두 보냈다면 리턴이 되고, 시간이 초과되었다면 에러와 함께 리턴이 된다. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Nagle algorithm Nagle 알고리즘이 적용되면, 운영체제는 패킷을 ACK가 오기를 기다렸다가 도착하면, 그 동안 쌓여있던 데이터를 한꺼번에 보내게 된다. 이러한 방식을 사용하게 되면, 대역폭이 낮은 WAN에서 빈번한 전송을 줄이게 됨으로 효과적인 대역폭활용이 가능해진다. 단점으로 연결과 연결해제 빈번하게 일어나는 경우에는 오히려 반응 속도를 줄일 수 있는 요소가 된다는 점이다. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Read Timeout : socket system call SO_RCVTIMEO and SO_SENTIMEO time structure 사용 struct timeval{ long tv_sec; /*second*/ long tv_usec; /*microsecond*/ }; struct timeval time; time.tv_sec = 1; time.tv_usec = 10; setsockopt( int sock, SOL_SOCKET, SO_RCVTIMEO, &time, sizeof(time) ); Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Read Timeout : select() fcntl()를 이용해서 listen socket을 NON_BLOCK상태로 만든다. 이를 select()로 감시하여 검출한다. Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.
Homepage www.thinmultimedia.co.kr 서울특별시 서초구 반포동 59-4 송원빌딩 3,4층 Tel 02 536 2840 Fax 02 536 3601 Homepage www.thinmultimedia.co.kr Copyright © 2005 Thin Multimedia, Inc. All Rights Reserved.