Presentation is loading. Please wait.

Presentation is loading. Please wait.

TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.

Similar presentations


Presentation on theme: "TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다."— Presentation transcript:

1 TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
8장. 소켓 옵션 TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.

2 개요 (1) 8-1 소켓 옵션의 종류와 관련 함수 소켓 프로그래밍 모델 소켓 프로그래밍
- 소켓을 통해 통신 프로토콜의 기능을 이용하는 응용 프로그램을 작성하는 것 - 소켓 함수(소켓 코드가 제공하는 인터페이스) 사용 개요 (1) 소켓 프로그래밍 모델 응용 프로그램 TCP IP UDP IrDA Bluetooth ... 소켓 소켓 코드 프로토콜 구현 코드

3 개요 (2) 소켓 옵션(Socket Option) 소켓 옵션의 종류(Kinds of Socket Option)
소켓 함수의 기본 동작을 변경 소켓 코드와 프로토콜 구현 코드를 세부적으로 제어 소켓 옵션의 종류(Kinds of Socket Option) ① 소켓 코드가 처리하는 옵션 옵션을 설정하면 소켓 코드에서 해석하고 처리 ② 프로토콜 구현 코드가 처리하는 옵션 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리

4 개요 (3) 소켓 옵션 설정(=변경)하기 int setsockopt ( SOCKET s, //옵션을 적용할 대상 소켓
See p261 int setsockopt ( SOCKET s, //옵션을 적용할 대상 소켓 int level, //옵션을 해서 처리할 주체를 지시 //SOL_SOCKET 소켓코드가 처리 //IPPROTO_IP IPv4 프로토콜 코드가 처리 //IPPROTO_IPV6 IPv6 프로토콜 코드가 처리 //IPPROTO_TCP TCP 프로토콜 코드가 처리 int optname, //설정할 옵션의 이름 char *optval, //설정할 옵션 값을 담고 있 는 버퍼의 주소 int optlen //optval이 가리키는 버퍼의 크기 ) ; 성공: 0, 실패: SOCKET_ERROR

5 개요 (4) 현재 설정된 소켓 옵션 값 얻기 int getsockopt ( SOCKET s, //옵션을 적용할 대상 소켓
See p261 int getsockopt ( SOCKET s, //옵션을 적용할 대상 소켓 int level, //옵션을 해서 처리할 주체를 지시 int optname, //값을 얻을 옵션의 이름 char *optval, //얻은 옵션 값을 저장할 버퍼의 주소 int *optlen //value-result 인자로 사용 ) ; 성공: 0, 실패: SOCKET_ERROR

6 소켓 옵션의 종류 (1) level = SOL_SOCKET optname optval get set 설명
SO_BROADCAST BOOL . 브로드캐스팅 데이터 전송 허용 여부 SO_KEEPALIVE 주기적으로 연결 상태 확인 여부 SO_LINGER linger{} 소켓 송신 버퍼에 미전송 데이터가 있을 때 closesocket() 함수의 리턴 지연 시간 설정 SO_SNDBUF SO_RCVBUF int 소켓 송/수신 버퍼의 크기 설정 SO_SNDTIMEO SO_RCVTIMEO 데이터 송/수신 함수 호출 시 타임아웃 값 설정 SO_REUSEADDR 지역 주소(IP 주소, 포트 번호) 재사용 허용 여부

7 소켓 옵션의 종류 (2) level = IPPROTO_IP optname optval get set 설명 IP_HDRINCL
BOOL . 데이터 송신 시 IP 헤더 직접 포함 여부 IP_TTL int IP 패킷의 TTL(time-to-live) 값 설정 IP_MULTICAST_IF IN_ADDR{} 멀티캐스트 패킷을 보낼 인터페이스 선택 IP_MULTICAST_TTL 멀티캐스트 패킷의 TTL 값 설정 IP_MULTICAST_LOOP 멀티캐스트 패킷의 루프백 여부 IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP ip_mreq{} 멀티캐스트 그룹 가입과 탈퇴

8 소켓 옵션의 종류 (3) level = IPPROTO_IPV6 optname optval get set 설명
IPV6_HDRINCL BOOL . 데이터 송신 시 IP 헤더 직접 포함 여부 IPV6_UNICAST_HOPS int IP 패킷의 TTL(time-to-live) 값 설정 IPV6_MULTICAST_IF DWORD 멀티캐스트 패킷을 보낼 인터페이스 선택 IPV6_MULTICAST_HOPS 멀티캐스트 패킷의 TTL 값 설정 IPV6_MULTICAST_LOOP 멀티캐스트 패킷의 루프백 여부 IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP ipv6_mreq{} 멀티캐스트 그룹 가입과 탈퇴

9 소켓 옵션의 종류 (4) level = IPPROTO_TCP optname optval get set 설명
TCP_NODELAY BOOL . Nagle 알고리즘 작동 여부

10 8-2 SOL_SOCKET 레벨 옵션 소켓 코드에서 해석하고 처리 프로토콜 독립적 성격 모든 프로토콜에 공통적으로 적용 할 수 있는 것은 아니므로 주의

11 SO_BROADCAST 옵션 용도 사용 예 브로드캐스트 데이터 전송 기능 활성화 TCP 소켓에는 사용할 수 없음
UDP 소켓에만 사용 가능 사용 예 BOOL bEnable = TRUE; retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&bEnable, sizeof(bEnable)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");

12 SO_KEEPALIVE 옵션 See p265 for details 용도 TCP 프로토콜 수준에서 연결 여부를 확인하려고 상대 TCP에 주기적으로(약 2시간 간격) TCP 패킷을 보냄 TCP 소켓에만 사용 가능 사용 예 BOOL bEnable = TRUE; retval = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&bEnable, sizeof(bEnable)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");

13 See p266~p269 for details SO_LINGER 옵션 옵션의 필요성? 이 옵션을 설정하면 소켓 송신 버퍼에 미전송 데이터가 있을 때 closesocket() 함수의 리턴 지연시간을 제어 가능 옵션의 필요성을 이해하기 위해 데이터를 보낸 직후에 소켓을 닫는 상황을 생각 TCP 소켓 사용시, closesocket()함수는 다음의 2가지 기능을 함 - 소켓을 닫고 할당된 OS 자원을 반환 - TCP 프로토콜 수준에서 연결 종료 절차를 시작 send(sock, ...); // 데이터를 보낸다. closesocket(sock); // 소켓을 닫는다. -> See p268 for using shutdown()

14 graceful close 2 * MSL

15 240 초 MSL = “Maximum Segment Lifetime” MSL = 120 초 TIME_WAIT = 2MSL
graceful close MSL = “Maximum Segment Lifetime” MSL = 120 초 TIME_WAIT = 2MSL HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\TcpTimedWaitDelay 240 초

16 Initiator Receiver abortive close RST ESTABLISHED connection
CLOSED

17 SO_LINGER 옵션 질문에 대한 답으로 3가지 동작 방식 생각 가능
그런데 closesocket() 함수 호출 시점에 send()함수로 보내려던 데이터가 송신 버퍼에 아직 남아 있다면 어떻게 될까? 3가지 질문: Q1 closesocket() 함수는 언제 리턴하는가? Q2 송신 버퍼에 남아 있는 데이터를 보낼 것인가, 삭제할 것인가? Q3 TCP 연결을 어떤 방식 (정상 종료 혹은 강제 종료)으로 종료할 것인가? 질문에 대한 답으로 3가지 동작 방식 생각 가능

18 SO_LINGER 옵션 ① closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 백그라운드로 모두 보내고 TCP 연결을 정상 종료 ② closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 삭제하고 TCP 연결을 강제 종료 ③ 송신 버퍼의 데이터를 모두 보내고 TCP 연결을 정상 종료한 후 closesocket() 함수가 리턴. 일정 시간 안에 송신 버퍼의 데이터를 모두 보내지 못하면 TCP 연결을 강제 종료한 후 closesocket() 함수가 리턴. 이때 송신 버퍼에 남은 데이터는 삭제

19 SO_LINGER 옵션 (1) 용도 옵션 값으로 linger 구조체 사용
closesocket() 함수의 2가지 기능을 세부적으로 제어하는데 사용 이를 이용하면 ①~③중 한가지 동작 구현 가능 TCP 소켓에만 사용가능 TCP 서버/ TCP 클라이언트에 SO_LINGER 옵션 적용....(see p269) 옵션 값으로 linger 구조체 사용 struct linger { u_short l_onoff; // option on/off u_short l_linger; // linger time }; typedef struct linger LINGER;

20 LINGER { 0, …} LINGER { 1, 0} LINGER { 1, 양수}
SO_LINGER 옵션 ① closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 백그라운드로 모두 보내고 TCP 연결을 정상 종료 ② closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 삭제하고 TCP 연결을 강제 종료 ③ 송신 버퍼의 데이터를 모두 보내고 TCP 연결을 정상 종료한 후 closesocket() 함수가 리턴. 일정 시간 안에 송신 버퍼의 데이터를 모두 보내지 못하면 TCP 연결을 강제 종료한 후 closesocket() 함수가 리턴. 이때 송신 버퍼에 남은 데이터는 삭제 LINGER { 0, …} LINGER { 1, 0} LINGER { 1, 양수}

21 SO_LINGER 옵션 (2) 사용 예 LINGER optval;
See p266~p269 for details SO_LINGER 옵션 (2) 사용 예 LINGER optval; optval.l_onoff = 1; /* linger on */ optval.l_linger = 10; /* linger time = 10초 */ retval = setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&optval, sizeof(optval)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");

22 SO_LINGER 옵션 (3) 옵션 값에 따른 closesocket() 함수 동작
See p266~p269 for details SO_LINGER 옵션 (3) 옵션 값에 따른 closesocket() 함수 동작 struct linger{} closesocket() 함수 동작 추가 설명 l_onoff l_linger 사용 안함 ①과 동일 closesocket() 함수의 기본 동작 1 ②와 동일 양수 ③과 동일 ① closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 백그라운드로 모두 보내고 TCP 연결을 정상 종료 ② closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 삭제하고 TCP 연결을 강제 종료 ③ 송신 버퍼의 데이터를 모두 보내고 TCP 연결을 정상 종료한 후 closesocket() 함수가 리턴. 일정 시간 안에 송신 버퍼의 데이터를 모두 보내지 못하면 TCP 연결을 강제 종료한 후 closesocket() 함수가 리턴. 이때 송신 버퍼에 남은 데이터는 삭제

23 SO_SNDBUF, SO_RCVBUF 옵션
용도 OS가 소켓에 할당하는 송신 버퍼와 수신 버퍼 크기 변경 사용 예(SO_RCVBUF 옵션) int optval, optlen; // 연결 대기(listening) 수신 버퍼의 크기를 얻는다. optlen = sizeof(optval); retval = getsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, (char *)&optval, &optlen); if(retval == SOCKET_ERROR) err_quit("getsockopt()"); printf("수신 버퍼 크기(old) = %d바이트\n", optval); // 연결 대기(listening) 수신 버퍼의 크기를 두 배로 늘린다. optval *= 2; retval = setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, (char *)&optval, sizeof(optval)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");

24 SO_SNDTIMEO, SO_RCVTIMEO 옵션
옵션의 필요성 socket() 함수로 만든 소켓은 블록킹 소켓이므로, 데이터 전송 함수 호출시 조건이 만족되지 않으면 무한정 블록되어 교착상태(deadlock)가 발생가능 이때 SO_SNDTIMEO, SO_RCVTIMEO 옵션으로 timeout을 설정해두면, 전송 함수가 작업완료와 상관없이 일정 시간 후에 리턴하게 할 수 있음 용도 교착상태 (deadlock) 방지 - 데이터 전송 함수가 작업 완료와 상관없이 일정 시간 후 리턴하게 함 통신 상대가 일정 시간 안에 응답하는지 확인 TCP & UDP 소켓 모두에 사용 가능

25 SO_SNDTIMEO, SO_RCVTIMEO 옵션
int optval = 3000; retval = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&optval, sizeof(optval)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");

26 SO_REUSEADDR 옵션 용도 목적(SO_REUSEADDR 옵션 설정) 현재 사용 중인 IP 주소와 포트 번호를 재사용
현재 사용 중인 IP 주소와 포트 번호를 이용해 bind() 함수를 (성공적으로) 호출할 수 있음 TCP & UDP 소켓 모두에 사용 가능 목적(SO_REUSEADDR 옵션 설정) TCP 서버 종료 후 재실행 시 bind( ) 함수에서 오류가 발생하는 일을 방지 (TCP 서버에) 여러 IP 주소를 보유한 호스트에서 같은 기능의 서버를 IP 주소별로 따로 운용할 수 있게 함 (TCP & UDP 서버에) 멀티캐스팅 응용 프로그램이 같은 포트 번호를 사용할 수 있게 함 (UDP 서버에) See p273-p274 for details

27 실습 8-1 SO_REUSEADDR 옵션 테스트
4장 TCPServer with SO_REUSEADDR 옵션 + 4장 TCPClient 7장 UDPServer with SO_REUSEADDR 옵션 + 7장 UDPClient p271~p272 테스트 결과: 같은 서버를 두 개(이상) 실행해도 문제가 없으며, 그 중 하나만 클라이언트 요청에 응답함 만약 SO_REUSEADDR 옵션을 설정하지 않고 실행하면 2nd 서버를 실행할 때 bind()함수에서 오류 발생

28 8-3-1 멀티 캐스팅 개념

29 8-3 IPPROTO_IP, IPPROTO_IPV6 레벨 옵션
IPPROTO_IP, PPROTO_IPV6 레벨 옵션은 각각 IPv4, IPv6 프로토콜 코드에서 해석하고 처리 AF_INET, AF_INET6주소 체계를 사용하는 소켓에만 적용가능 멀티캐스팅은 UDP 소켓에만 적용 가능 (TCP 소켓에는 가용 불가) level = IPPROTO_IP optname optval get set 설명 IP_HDRINCL BOOL . 데이터 송신 시 IP 헤더 직접 포함 여부 IP_TTL int IP 패킷의 TTL(time-to-live) 값 설정 IP_MULTICAST_IF IN_ADDR{} 멀티캐스트 패킷을 보낼 인터페이스 선택 IP_MULTICAST_TTL 멀티캐스트 패킷의 TTL 값 설정 IP_MULTICAST_LOOP 멀티캐스트 패킷의 루프백 여부 IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP ip_mreq{} 멀티캐스트 그룹 가입과 탈퇴

30 멀티캐스팅 (0) 8-3 IPPROTO_IP, IPPROTO_IPV6 레벨 옵션
8-3-1 멀티 캐스팅 개념 멀티캐스팅을 사용하면 같은 그룹에 속한 모든 개체가 서로 통신 가능 예약된 IP 주소 사용 멀티캐스트용 IP 주소 Class D 통신할 대상 멀티캐스트 그룹을 나타냄 4비트 28비트 멀티캐스트 주소 IPv4 ~ 1 그룹 ID 8비트 4비트 4비트 112비트 멀티캐스트 주소 IPv6 Flags Scope 그룹 ID 응용 프로그램은 멀티캐스트 데이터를 수신하기 위해 멀티캐스트 그룹에서 자유롭게 가입(join)하고 탈퇴(leave)할 수 있다

31 멀티캐스팅 (1) 특징 그룹 가입과 탈퇴가 자유롭고 그룹 구성원 모두가 평등
멀티캐스트 데이터를 받으려면 반드시 그룹에 가입해야 함 멀티캐스트 데이터를 보내려고 그룹에 가입할 필요는 없음

32 멀티캐스팅 (2) 멀티캐스트 데이터 전송 그룹 구성원이 데이터를 보내는 경우 A B 멀티캐스트 그룹

33 멀티캐스팅 (3) 멀티캐스트 데이터 전송 그룹 비구성원이 데이터를 보내는 경우 A B C 멀티캐스트 그룹

34 실습 8-2 멀티캐스팅(IPv4) 예제 작성과 테스트
7장 브로드캐스팅 예제를 멀티캐스팅 예제로 변경 MulticastSender: 사용자가 키보드로 입력한(fgets) 문자열을 멀티캐스트 주소로 보냄(sendto) MulticastReceiver: 멀티캐스트 그룹에 가입, 멀티캐스트 데이터를 받음(recvfrom), 이를 문자열로 간주해 무조건 화면에 출력(printf) [그림8-9] 실행결과: MulticastReceiver를 2+개 실행해도 문제가 없고, MulticastSender가 보낸 데이터가 모든 MulticastReceiver에 도달 함(see p283) See p276~p282

35 실습 8-3 멀티캐스팅(IPv6) 예제 작성과 테스트

36 IPor IPV6_MULTICAST_IF 옵션 (1)
8-3-4 멀티 캐스팅 코드 분석 IPor IPV6_MULTICAST_IF 옵션 (1) 용도 IP 주소를 둘 이상 보유한 호스트에서 멀티캐스트 데이터를 보낼 네트워크 인터페이스를 선택할 때 사용 사용 예 IN_ADDR localaddr; localaddr.s_addr = inet_addr(" "); setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localaddr, sizeof(localaddr));

37 IPor IPV6_MULTICAST_IF 옵션 (2)
IP_MULTICAST_IF 옵션 설정 결과 응용 프로그램

38 IPor IPV6_MULTICAST_TTLor HOPS 옵션 (1)
용도 IP 헤더의 TTL(또는 Hop Limit) 값을 변경 멀티캐스트 패킷이 생성될 때 IP 헤더의 TTL(time-to-live) 필드는 기본값 1로 설정됨 TTL은 라우터를 통과할 때마다 1씩 감소하는데, 0이 되면 패킷이 버려짐 따라서 TTL=1은 멀티캐스트 패킷이 라우터 경계를 넘어갈 수 없음을 뜻함 라우터 경계를 넘어 특정 범위까지 IPv4 멀티캐스트 패킷을 보내려면 IP_MULTICAST_TTL 옵션을 사용해 TTL을 값을 변경해야 함 응용 프로그램 데이터 IP 헤더 UDP 헤더 TTL UDP 멀티캐스트 패킷 구성

39 IPor IPV6_MULTICAST_TTLor HOPS 옵션 (2)
사용 예#1 사용 예#2 int ttl = 2; retval = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)); if(retval == SOCKET_ERROR) err_quit("setsockopt()"); int ttl = 2; retval = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl, sizeof(ttl)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");

40 IPor IPV6_MULTICAST_LOOP 옵션
용도 멀티캐스트 그룹에 가입한 응용 프로그램이 자신의 그룹에 멀티캐스트 데이터를 보낼 때 자신도 받을지를 결정 사용 예 // 자신이 보낸 멀티캐스트 데이터는 받지 않는다. BOOL optval = FALSE; setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&optval, sizeof(optval));

41 IPor IPV6_ADD_MEMBERSHIP, IPor IPV6_DROP_MEMBERSHIP 옵션 (1)
용도 멀티캐스트 그룹에 가입 또는 탈퇴 옵션값 멀티캐스트 데이터를 받으려면 반드시 멀티캐스트 그룹에 가입해야 함 #include <ws2tcpip.h> typedef struct ip_mreq { IN_ADDR imr_multiaddr; // IPv4 multicast address IN_ADDR imr_interface; // Local IP address of interface } IP_MREQ; typedef struct ipv6_mreq { IN6_ADDR ipv6mr_multiaddr; // IPv6 multicast address ULONG ipv6mr_interface; // Interface index } IPV6_MREQ; 가입하거나 탈퇴할 멀티캐스트 주소 멀티캐스트 패킷을 받을 네트워크 인터페이스의 ipV4 주소. INADDR_ANY (0으로 정의)를 전달해 자동으로 선택하는게 일반적

42 IPor IPV6_ADD_MEMBERSHIP, IPor IPV6_DROP_MEMBERSHIP 옵션 (2)
사용 예 IP_ADD_MEMBERSHIP 옵션을 이용해 특정 네트워크 인터페이스( )를 멀티캐스트 그룹( )에 가입시키는 코드 탈퇴하는 코드 See p293 struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(" "); mreq.imr_interface.s_addr = inet_addr(" "); setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));

43 IPor IPV6_ADD_MEMBERSHIP, IPor IPV6_DROP_MEMBERSHIP 옵션 (3)
IP_ADD_MEMBERSHIP 옵션 설정 결과 응용 프로그램 이 코드를 수행하면 주소가 인 네트워크 인터페이스가 멀티캐스트데이터를 받음

44 8-4 IPPROTO_TCP 레벨 옵션 IPPROTO_TCP 레벨 옵션은 TCP 프로토콜 코드에서 해석하고 처리 TCP소켓에만 적용가능

45 TCP_NODELAY 옵션 (1) 8-4 IPPROTO_TCP 레벨 옵션 TCP의 데이터 전송 원리 P294-p295
데이터 1 데이터 2 ACK 4 데이터 3 윈도우 크기 = 3 데이터 4 ... 데이터 1 ACK 2 데이터 2 ACK 3 ACK를 이용한 데이터 수신 확인 sliding window를 이용한 전송 효율 높임

46

47 User Data: 1 Byte TCP Header: 20 Bytes IP Header: 20 Bytes Ratio overhead:data :1

48 4000% overhead!

49 window size = 5 ACK User Data: 5B, Overhead: 200B

50 NAGLE 1 ACK User Data: 5B, Overhead: 40B 78% reduction

51 NAGLE 2 MSS

52 TCP_NODELAY 옵션 (2) 용도 Nagle 알고리즘
Nagle(네이글) 알고리즘 작동을 중지하는 역할을 함 => Nagle 알고리즘의 장점을 포기하는 대신 응용 프로그램의 속도를 빠르게 할 때 사용함 Nagle 알고리즘 작은 패킷이 불필요하게 많이 생성되는 일을 방지해 네트워크 트래픽을 감소시키는 알고리즘 TCP 전송 효율과 네트워크 활용도를 높인다는 장점이 있기 때문에 TCP프로토콜에서는 기본으로 동작 일반적으로 TCP_NODELAY 옵션을 설정하지 않는 것이 바람직 TCP_NODELAY 옵션이 필요한 경우도 있음

53 TCP_NODELAY 옵션 (3) Nagle 알고리즘의 동작 방식
보낼 데이터가 MSS(maximum segment size)로 정의된 크기만큼 쌓이면, 상대편에 무조건 보냄. 이 경우 sliding window방식으로 데이터를 계속 보낼 수 있음 보낼 데이터가 MSS보다 작으면, 이전에 보낸 데이터에 대한 ACK가 오기를 기다림. ACK가 도착하면 보낼 데이터가 MSS보다 작더라도 상대편에 보냄. 이 경우 데이터를 전송할 때마다 ACK를 기다리고, ACK를 받으면 다음 데이터를 전송하는 동작을 반복 데이터가 충분히 크면 곧바로 보내고, 그렇지 않으면 쌓일 때까지 대기한다. 단, 데이터가 충분히 쌓이지 않았더라도 이전에 보낸 데이터를 상대편이 받았다면 다음 데이터를 보낸다

54 TCP_NODELAY 옵션 (3) Nagle 알고리즘의 장단점 사용 예
단점: 데이터가 충분히 쌓일 때까지 또는 ACK가 도달할 때까지 대기하는 시간 때문에 응용 프로그램의 반응 시간이 길어질 수 있음 사용 예 Nagle 알고리즘의 장점을 포기하는 대신 응용 프로그램의 속도를 빠르게 할 때 사용함 BOOL optval = TRUE; // Nagle 알고리즘 중지 setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof(optval));

55 감사합니다 TCP/IP 윈도우 소켓 프로그래밍


Download ppt "TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다."

Similar presentations


Ads by Google