클라이언트에서 555사이즈 packet을 400번 보내면 서버에서 받는모습은(?)

1. 클라이언트에서 555사이즈 packet을 400번 보내면 555 * 400 = 222,000이다.

2. 파일에서의 사이즈는 229,200이다.("\r\n" + 기타정보를 추가로 입력했기때문에 사이즈가 늘어났다.)
-rw-r--r-- 1 B210145_BK 197121    229200 Apr 22 08:32 packefile_2024_04_22_08_32_24.txt
-rw-r--r-- 1 B210145_BK 197121    229200 Apr 22 08:34 packefile_2024_04_22_08_34_02.txt
-rw-r--r-- 1 B210145_BK 197121    229200 Apr 22 08:35 packefile_2024_04_22_08_34_58.txt

3. 클라이언트에서 555를 보낸다고해서, 서버에서 555을 받지는 않는다.
장비 네크워크 사정, 서버의 처리속도, 등등을 따져서 서버에서 받는 수신 packet 의 사이즈는 틀려진다.

4. 마지막 서버에서 모든 수신된 packet의 길이를 더하면 클라이언트에서 보낸 사이즈와 같다.

유실이 없다.(tcp/ip)

5. 위의 화면을 보면, 클라이언트에서 보내는 모습과 서버에서 받는모습이 나타나있다.
자세히 보면, 어떻게 클라이언트와 서버가 데이타를 주고받는지 알수 있다.

궁금한점은 xterm92@naver.com으로,ㅡㅡ,ㅡㅡㅡㅡ

 

windows_send_basic.exe 127.0.0.1 21111 "E:\exture_plus_raw_internet_log_20230418\home\release\Paxfeed_x64\backup\TickerplantRaw_EXTURE_PLUS_INTERNET_REAL_STANDBY\20230418_13_internet_Kse_32114.log"

-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_32113.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_32112.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kosdaq_33112.log
-rw-r--r-- 1 B210145_BK 197121    3013444 Apr 18  2023 20230418_20_internet_Kse_32115.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_FutureIndex_35115.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_OptionIndex_36112.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_OptionIndex_36111.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_45111.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_FutureIndex_35114.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_32114.log
-rw-r--r-- 1 B210145_BK 197121       5520 Apr 18  2023 20230418_20_internet_Elw_34913.log
-rw-r--r-- 1 B210145_BK 197121       5460 Apr 18  2023 20230418_20_internet_Kse_40116.log
-rw-r--r-- 1 B210145_BK 197121       5460 Apr 18  2023 20230418_20_internet_Kse_40112.log
-rw-r--r-- 1 B210145_BK 197121       5460 Apr 18  2023 20230418_20_internet_Kse_40111.log
-rw-r--r-- 1 B210145_BK 197121       5520 Apr 18  2023 20230418_20_internet_Elw_34912.log
-rw-r--r-- 1 B210145_BK 197121       5612 Apr 18  2023 20230418_20_internet_Elw_34914.log

windows_send_basic.c
0.00MB
windows_recv_basic.c
0.00MB
linux_recv_basic.c
0.00MB

 

/*
전제:TCP/IP의 중요한 성질

5. Flow control
송신자는 수신자가 받을 수 있는 만큼 데이터를 전송한다. 
수신자가 자신이 받을 수 있는 바이트 수 (사용하지 않은 버퍼 크기, receive window)를 송신자에게 전달한다. 
송신자는 수신자 receive window가 허용하는 바이트 수만큼 데이터를 전송한다.
*/

case1)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte)

case2)
send:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
send:A0011,,,,,,(500byte)
recv:A0011,,,,,,(500byte) * 3

How to process such a case(?)
위의 2가지 조건을 모두 충족시킬수 있도록 서버측에서 프로그램이 구현되어야 할것이다.

TCP/IP
transmission control protocol/Internet protocol 

네트워크 간 전송 제어 프로토콜.
서로 다른 시스템을 가진 컴퓨터들을 서로 연결하고, 데이터를 전송하는 데 사용하는 통신 프로토콜들의 집합

 

데이터 전송

 

데이터 수신

 

스택 내부 제어 흐름(control flow)

 

인터럽트와 수신 패킷 처리

 

데이터 구조체

TCP control block

 

드라이버와 NIC의 통신

 

패킷 전송 과정을 따라가며 링을 어떻게 사용하는지 알아보자.

 

 패킷 수신 과정을 볼 수 있다.

 

 

스택 내부 버퍼와 제어 흐름(flow control)

 

 

 

 

 

 

성능 이해와 현상 분석을 하기 위해 운영체제의 TCP/IP 관련 코드 한 줄 한 줄을 모두 이해하고 있을 필요는 없다. 큰 흐름만 알고 있어도 많은 도움이 된다.

https://d2.naver.com/helloworld/47667

 

 

#console tcp server ,client

 

f_ser.cs
0.00MB
f_cli.cs
0.00MB

#거래소 & Koscom 데이타를 보내는쪽은 Nagle 알고리즘을 적용한다.
#거래소 & Koscom 데이타를 보내는쪽은 Nagle 알고리즘을 적용한다.

#거래소 & Koscom
데이타를 송신하는부분에서
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)

#거래소 & Koscom 데이타를 수신하는쪽은
#recv = 102 * 1 byte
#recv = 102 * 4 byte
임을 보인다.

혹시라도, #거래소 & Koscom 데이타를 보내는쪽에서 Nagle 알고리즘을 적용하지 않는다면
비고) 송신하는 프로그램에서 다음의 코드를 추가하면, Nagle 알고리즘을 적용하지 않는다.
#include<netinet/tcp.h>
char on=1;
if(setsockopt(sock,OPPROTO_TCP,TCP_NODELAY,(char *)&on,sizeof(on))<0) printf("error!!\n");

#거래소 & Koscom데이타를 송신하는부분에서
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)

#거래소 & Koscom데이타를 수신하는쪽은
#recv = 102 byte
#recv = 102 byte
#recv = 102 byte
#recv = 102 byte
#recv = 102 byte
임을 보인다. 

#Nagle 알고리즘에 대해서 알아본다.

Nagle알고리즘? 네트워크 상에 패킷의 수를 줄이기 위해 개발된 알고리즘

1. 일반 네트워크 통신방법
- 일반적인 통신알고리즘은 데이터는 패킷으로 만들어 보낸다는 것이며 수신호스트는 이에 대한 ACK를 보낸다는 것입니다. 
예를 들어, A,B 두 호스트가 통신을 합니다. A는 B에게 'Nagle'라는 데이터를 보내기 원하면, 
먼저 'N'이라는 데이터를 패킷으로 만들어 출력버퍼로 보냅니다. 
그리고 ACK를 받고 안받고 관계없이 'a'를 패킷으로 만들어 보내고 이어서 'g', 'l', 'e' 각 데이터를 패킷으로 만들어 보낼 것입니다. 
수신호스트로부터의 ACK가 언제 오는가는 전혀 관계가 없고, 언제 오든지 오기만 하면 되는 것입니다.

2. Nagle 알고리즘
- 네트웍에서 Nagle 알고리즘은 "가능하면 조금씩 여러 번 보내지 말고 한번에 많이 보내라(Effective TCP)" 라는 원칙을 기반으로 만들어진 알고리즘입니다.
- Nagle 알고리즘의 원리는 ACK를 받은 다음에 데이터를 보내고 ACK를 받을 때까지 출력버퍼의 데이터를 저장하였다가 ACK를 받으면 버퍼의 데이터를 모두 패킷으로 만들어 보낸다는 것입니다. 
예를 들어 A가 'N'이라는 데이터를 패킷으로 만들어 보내고, 계속해서 다음 데이터를 보내는 것이 아니라 출력버퍼로 보내어 저장시켜 둡니다. 
그러다가 ACK가 오면 출력버퍼에 저장된 'agle'라는 데이터를 보냅니다.

 

 

- TCP 소켓은 Default로 Nagle 알고리즘을 적용하고 있습니다.

3. Nagle 알고리즘의 장단점
  - 장점 : 네트워크의 효율성이 높아짐. (똑같은 데이터를 보내더라도 생산하는 패킷이 적음)
  - 단점 : 송신 호스트가 ACK를 받을 때까지 기다려야 하므로 전송 속도가 느려짐

4. Nagle 알고리즘의 중단
  - 몇몇 네트웍 관련 프로그램에서는 네트웍의 전송량이나 부하보다는 빠른 응답속도를 더 중요시 여기는 상황이 있습니다. 
  그러한 때에는 TCP_NODELAY  라는 옵션을 사용하여 Nagle 알고리즘을 제거 할 수 있습니다.
  - TCP_NODELAY 옵션이
     1(TRUE) : Nagle 알고리즘을 적용하지 않습니다.
     2(FALSE): Nagle 알고리즘을 적용합니다.

int opt_val = TRUE;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val));

해당 옵션의 사용은 네트웍 부하를 극대화 시켜주면서 서버의 전체적인 성능을 무척 감소하기때문에 꼭 필요한 경우에만 매우 주의를 해서 사용해야 합니다.
- 전송은 작은 단위로 자주 이루어지지만 즉각적인 응답은 필요 없는 어플리케이션에서만 사용 되어야 합니다.(마우스 움직임 같은)
- Nagle 알고리즘은 리얼타임시스템에서의 제어와 특히나 인터렉티브한 키 입력을 하는 어플리케이션에서는 안 좋은 영향을 미칩니다. 
선택적으로 Nagle 알고리즘을 통과하는 한가지 방법은 Out-of-bind 메시지 시스템을 쓰는 것입니다. 
그러나 이것은 내용물에 제약이 있고 또 다른 문제(순서의 상실: loss of sequentiality)를 일으킬 수 있습니다.

#거래소 & Koscom tcp 데이타를 서버에서 받을때에 모습(송신쪽에서 Nagle On일경우)

 

#거래소 & Koscom tcp 데이타를 서버에서 받을때에 모습(송신쪽에서 Nagle Off일경우)

소스파트)
int sd, ret, on=1,off=0, sz_sbuf;

/* added to options of socket by Changseop Oh from CheongJo */

/* Now >>>> nagle off -----------------*/
/* Now >>>> nagle off -----------------*/
/* Now >>>> nagle off -----------------*/
if(setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,(char*)&off,sizeof(on))<0)
sprintf(ebuf, "setsockopt() : REUSEADDR setting Error!");

#FTP server/client standard tcp program

 

fss_client.c
0.00MB
fss_server.c
0.00MB

 

 

NOT fork

NOT thread

NOT select

STANDARD tcp OK

 

 

비고) 클라이언트소스에 <sys/sendfile.h>에 선언되어진 sendfile 이라는 함수가 유용하게 사용된다.

+ Recent posts