제 19 장 TCP 대화식 데이터 흐름
차례 서론 대화식 입력 지연된 확인응답 Nagle 알고리즘 윈도우 크기 정보 요약
19.1 서론 TCP 세그먼트 (TCP 트래픽에 관한 연구에 따르면) 이유 패킷-카운트를 기준으로 분류 19.1 서론 TCP 세그먼트 (TCP 트래픽에 관한 연구에 따르면) 패킷-카운트를 기준으로 분류 대용량 데이터 : 50% (FTP, 전자우편, 유즈넷 뉴스) 대화식 데이터 : 50% (Telnet, Rlogin) 바이트 카운트 기준으로 분류 대용량 데이터 : 90% 대화식 데이터 : 10% 이유 대용량 데이터 세그먼트는 최대 길이가 되는 반면, 대화식 데이터는 훨씬 작기 때문.
19.2 대화식 입력 Rlogin 연결에서의 데이터 흐름 한 번에 한 바이트씩 전송 4가지 세그먼트 생성 19.2 대화식 입력 Rlogin 연결에서의 데이터 흐름 한 번에 한 바이트씩 전송 4가지 세그먼트 생성 (1) 클라이언트로부터 대화식 키보드 입력 (2) 서버로부터 키보드 입력에 대한 확인응답 (3) 서버로부터 키보드 입력에 대한 에코 (4) 클라이언트로부터 에코에 대한 확인응답 데이터 바이트 데이터 바이트의 ack 데이터 바이트의 에코 에코된 바이트의 ack 키보드 입력 서버 에코 디스플레이 클라이언트
예제 5개의 문자(date\n)를 키보드로 입력했을 때의 TCP 세그먼트 svr4 % date svr4 % Sat Feb 6 07:52:17 MST 1993 svr4 % 1 0.0 bsdi.1023 > svr4.login:P 0:1(1) ack 1 win 4096 2 0.016497 (0.0165) svr4.login > bsdi.1023:P 1:2(1) ack 1 win 4096 3 0.139955 (0.1235) bsdi.1023 > svr4.login: . ack 2 win 4096 4 0.458037 (0.3181) bsdi.1023 > svr4.login:P 1:2(1) ack 2 win 4096 5 0.474386 (0.0163) svr4.login > bsdi.1023:P 2:3(1) ack 3 win 4096 6 0.539943 (0.0656) bsdi.1023 > svr4.login: . ack 3 win 4096
예제 (Cont’d) 7 0.814582 (0.2746) bsdi.1023 > svr4.login:P 2:3(1) ack 3 win 4096 8 0.831108 (0.0165) svr4.login > bsdi.1023:P 3:4(1) ack 3 win 4096 9 0.940112 (0.1090) bsdi.1023 > svr4.login: . ack 4 win 4096 10 1.191287 (0.2512) bsdi.1023 > svr4.login:P 3:4(1) ack 4 win 4096 11 1.207701 (0.0164) svr4.login > bsdi.1023:P 4:5(1) ack 4 win 4096 12 1.339994 (0.1323) bsdi.1023 > svr4.login: . ack 5 win 4096 13 1.680646 (0.3407) bsdi.1023 > svr4.login:P 4:5(1) ack 5 win 4096 14 1.697977 (0.0173) svr4.login > bsdi.1023:P 5:7(2) ack 5 win 4096 15 1.739974 (0.0420) bsdi.1023 > svr4.login: . ack 7 win 4096 16 1.799841 (0.0599) svr4.login > bsdi.1023:P 7:37(30) ack 5 win 4096 17 1.940176 (0.1403) bsdi.1023 > svr4.login: . ack 37 win 4096 18 1.944338 (0.0042) svr4.login > bsdi.1023:P 37:44(7) ack 5 win 4096 19 2.140110 (0.1958) bsdi.1023 > svr4.login: . ack 44 win 4096
19.3 지연된 확인응답 보통 TCP는 데이터를 받는 즉시 ACK를 보내지 않고, ACK를 지연시켜서 같은 방향으로 향하는 데이터와 함께 전송되도록 한다. bsdi.1023 Svr4.login PSH 0:1(1) ack 1(d) 0.0 0.016497 (0.0165) *0.139955 (0.1235) 0.458037 (0.3181) 0.474386 (0.0163) *0.539943 (0.0656) 0.814582 (0.2746) 0.831108 (0.0165) *0.940112 (0.1090) 1.191287 (0.2512) 1.20770 (0.0164) *1.339994 (0.1323) 1 PSH 1:2(1) ack 1 (echo of d) 2 지연된 ACK 3 ack 2 시간의 간격은 200ms의 배수 139.9 ms 539.9 ms 940.1ms 1339.9 ms 4 PSH 1:2(1) ack 2(a) PSH 2:3(1) ack 2 (echo of a) 5 지연된 ACK 6 ack 3 7 PSH 2:3(1) ack 3(t) PSH 3:4(1) ack 3 (echo of t) 8 지연된 ACK 9 ack 4 10 PSH 3:4(1) ack 4(e) PSH 4:5(1) ack 4 (echo of e) 11 지연된 ACK 12 ack 5
19.4 Nagle 알고리즘 발생배경 방법 장점 작은 패킷은 WAN에서는 혼잡에 영향을 줄 수 있다. 작은 양의 데이터가 TCP에 의해 모아져서 확인응답이 도착할 때에 보낸다. 장점 자기-클럭 조정(self-clocking) ACK가 빨리 돌아오면 데이터도 빨리 보내게 된다.
19.4 Nagle 알고리즘 (cont’d) slip과 vangogh.cs.berkeley.edu간에 rlogin을 이용한 데이터 흐름 PSH 5:6(1) ack 47, win 4096 PSH 47:48(1) ack 6, win 8192 PSH 6:7(1) ack 48, win 4096 PSH 48:49(1) ack 7, win 8192 PSH 7:9(2) ack 49, win 4095 PSH 49:51(2) ack 9, win 8192 Slip.0123 Vangogh.login 1 2 3 4 5 6 7 8 9 10 11 0.0 0.197694 (0.1977) 0.232457 (0.0348) 0.437593 (0.2051) 0.464257 (0.0267) 0.677658 (0.2134) 0.707709 (0.0301) 0.917762 (0.2101) 0.945862 (0.0281) 1.157640 (0.2118) 1.187501 (0.0299) 1.427852 (0.2404) 1.428025 (0.0002) 1.47191 (0.0292) 1.478429 (0.0212) 1.727608 (0.2492) 1.762913 (0.0353) 1.997900 (0.2350) PSH 9:10(1) ack 49, win 4094 PSH 51:52(1) ack10, win 8192 PSH 10:12(2) ack 52, win 4095 PSH 52:54(2) ack12, win 8192 PSH 12:14(2) ack 54, win 4094 Ack14, , win 8190 13 14 PSH 54:56(2) ack14, win 8192 PSH 14:17(3) ack 54, win 8192 12 15 PSH 17:18(1) ack 56, win 4096 PSH 56:59(3) ack18, win 8191 16 17 PSH 18:21(3) ack 59, win 4093 PSH 59:60(1) ack21, win 8189 18
19.4 Nagle 알고리즘 (cont’d) Nagle 알고리즘 기능 억제가 필요한 경우 마우스 이동 특수한 Function key를 입력한 경우 Function key는 보통 복수 바이트의 데이터 생성
예제 복수 바이트 데이터를 생성하는 문자를 눌렀을 때 Nagle 알고리즘의 관찰 F1 키를 누른다. 1 0.0 slip.1023 > vangogh.login: P 1:2(1) ack 2 2 0.250520 (0.2505) vangogh.login > slip.1023: P 2:4(2) ack 2 3 0.251709 (0.0012) slip.1023 > vangogh.login: P 2:4(2) ack 4 4 0.490344 (0.2386) vangogh.login > slip.1023: P 4:6(2) ack 4 5 0.588694 (0.0984) slip.1023 > vangogh.login: . ack 6 F2 키를 누른다. 6 2.836830 (2.2481) slip.1023 > vangogh.login: P 4:5(1) ack 6 7 3.132388 (0.2956) vangogh.login > slip.1023: P 6:8(2) ack 5 8 3.133573 (0.0012) slip.1023 > vangogh.login: P 5:7(2) ack 8 9 3.370346 (0.2368) vangogh.login > slip.1023: P 8:10(2) ack 7 10 3.388692 (0.0183) slip.1023 > vangogh.login : . ack 10
예제 (cont’d) Nagle 알고리즘의 타임 라인 PSH 1:2(1) ack 2 PSH 2:4(2) ack 2 Slip.1023 Vangogh.login PSH 1:2(1) ack 2 PSH 2:4(2) ack 2 PSH 2:4(2) ack 4 PSH 4:6(2) ack 4 ack 6 PSH 4:5(1) ack 6 PSH 6:8(2) ack 5 PSH 5:7(2) ack 8 PSH 8:10(2) ack 7 ack 10 1 2 3 4 5 6 7 8 9 10 F1키 누름 F2키 누름 0.0 0.250520 (0.2505) 0.251709 (0.0012) 0.490344 (0.2386) 0.588694 (0.0984) 2.836830 (2.2481) 3.3132388 (0.2956) 3.3133573 (0.0012) 3.370346 (0.2368) 3.388692 (0.0183) N [ ESC M [ ESC F2키 F1키 순서#: 6 5 4 3 2 1 ^ [ [ M ^ [ [ N F1 에코 F2 에코 2 3 4 5 6 7 8 9
예제 (cont’d) Nagle 알고리즘이 동작하지 않도록 수정된 예 F1 키를 누른다. 1 0.0 slip.1023 > vangogh.login: P 1:2(1) 2 0.002163 (0.0022) slip.1023 > vangogh.login: P 2:3(2) ack 2 3 0.004218 (0.0021) slip.1023 > vangogh.login: P 2:3(1) ack 2 4 0.280621 (0.2764) vangogh.login > slip.1023: P 5:6(1) ack 4 5 0.281738 (0.0011) slip.1023 > vangogh.login: . ack 2 6 2.477561 (2.1958) vangogh.login > slip.1023: P 2:6(4) ack 4 7 2.478735 (0.0012) slip.1023 > vangogh.login: . ack 6 F2 키를 누른다. 8 3.217023 (0.7383) slip.1023 > vangogh.login: P 4:5(1) ack 6 9 3.219165 (0.0021) slip.1023 > vangogh.login: P 5:6(1) ack 6 10 3.221688 (0.0025) slip.1023 > vangogh.login: P 6:7(1) ack 6 11 3.460626 (0.2389) vangogh.login > slip.1023: P 6:8(2) ack 5 12 3.489414 (0.0288) vangogh.login > slip.1023: P 8:10(2) ack 7 13 3.640356 (0.1509) slip.1023 > vangogh.login : . ack 10
예제 (cont’d) Nagle 알고리즘의 타임 라인 N [ ESC M [ ESC F2키 F1키 순서#: 6 5 4 3 2 1 Slip.1023 Vangogh.login 1 3 5 7 8 9 10 F1키 누름 F2키 누름 0.0 0.002163 (0.0022) 0.004218 (0.0021) 0.280621 (0.2764) 0.281738 (0.0011) 2.477561 (2.1958) 2.478735 (0.0012) 3.217023 (0.7383) 3.219165 (0.0021) 3.221688 (0.0025) 3.460626 (0.2389) 3.489414 (0.0288) 3.640356 (0.1509) PSH 1:2(1) ack 2 PSH 2:3(1) ack 2 PSH 3:4(1) ack 2 PSH 5:6(1) ack 4 PSH 2:5(3) ack 3 (LOST) ack 2 ack 6 PSH 4:5(1) ack 6 PSH 5:6(1) ack 6 PSH 6:7(1) ack 6 ack 10 PSH 6:8(2) ack 5 PSH 8:10(2) ack 7 2 4 6 11 12 13 N [ ESC M [ ESC F2키 F1키 순서#: 6 5 4 3 2 1 PSH 2:6(4) ack 4 ^ [ [ M ^ [ [ N F1 에코 F2 에코 2 3 4 5 6 7 8 9
19.5 윈도우 크기 정보 서버 클라이언트 보통 8,192 바이트의 윈도우 광고 19.5 윈도우 크기 정보 서버 보통 8,192 바이트의 윈도우 광고 서버가 클라이언트로부터 입력을 읽고, 그것을 에코할 때까지 서버의 TCP는 보낼 것이 아무 것도 없기 때문 클라이언트 ACK가 도착할 때에 보낼 데이터를 가지고 있다. ACK를 기다리는 수신 문자를 버퍼에 저장하고 있기 때문에, 윈도우 광고는 4,096보다 적게 든다.
19.6 요약 대화식 방식의 데이터 지연된 확인응답 Nagle 알고리즘 보통 1바이트 데이터가 클라이언트에서 서버로 전송 19.6 요약 대화식 방식의 데이터 보통 1바이트 데이터가 클라이언트에서 서버로 전송 지연된 확인응답 송신자에게 돌려줄 데이터를 확인응답에 편승해서 보내는 가를 알아보기 위해 사용 Nagle 알고리즘 비교적 저속의 WAN에서 작은 세그먼트 수를 줄이기 위해 사용