컴퓨터 네트워크: Flow Control

2021. 10. 5. 21:30·Computer Science/컴퓨터 네트워크
반응형

TCP: Transmission Control Protocol

7. Flow Control

 

Flow Control

생산자가 데이터를 생성하는 속도와 소비자가 데이터를 사용할 수 있는 속도의 균형을 유지.

 

 

sliding window

Send window in TCP

  1. Sender는 Receiver가 Ack을 보내면서 알려준 rwnd 값을 통해 상대방 버퍼의 빈 공간을 파악하고, 그 빈 공간만큼을 Send window 사이즈로 정한다. window 사이즈는 Receiver가 한번에 받을 수 있는 데이터의 양이다.
  2. 데이터 전송 후, 보낸 데이터는 데이터 전송 오류를 대비하여 여전히 Sending Buffer에 남겨둔다.
  3. 상대방이 Ack을 보내 해당 데이터를 잘 받았다는 표시를 하면 해당 데이터를 Sending Buffer에서 삭제한다.
  4. 데이터를 삭제해서 생긴 빈 공간만큼 생산자가 생성한 데이터를 받아와 Receiver에게 보낼 준비를 한다. 

 

Receive window in TCP

  1. Receiver는 연결 과정에서 Sender에게 SYN + ACK을 보내면서 초기 rwnd 즉, Receiving Buffer의 빈 공간을 알려준다.
  2. 상대방이 데이터를 보내면 데이터의 양만큼 Receiving Buffer의 빈 공간이 줄어든다.
  3. 보낸 데이터를 잘 받았다는 확인을 하기 위해 상대방에게 다음 ACK를 보내면서, 현재 Receiving Buffer의 빈 공간도 함께 알려준다.(rwnd를 이용)
  4. read를 통해 읽어 application에게 올려보낸 데이터는 Receiving Buffer에서 삭제한다.

 

stop & wait와 window 방식의 효율성 비교

 

 

TCP/IP protocol suite

 

전체 조감도

 

Send

 

 

Receive

 

 

An example of flow control

  • 윈도우 사이즈가 어떻게 변하는지 주의깊게 살펴본다.
  • Client가 Sender, Server가 Receiver (단방향)

 

Silly Window Syndrome

<송신 측에서 발생하는 신드롬>

  • Nagle 알고리즘

키보드를 한 글자씩 칠 때마다 1byte의 데이터가 receiver에게 전송된다고 생각해 보자.

데이터 전송 시에는 MAC, IP, Port 번호가 반드시 필요하다. (택배는 송장없이 이동할 수 없다.) 따라서 1byte의 데이터를 전송하더라도 수신자의 주소의 정보를 담고 있는 헤더가 반드시 함께 전송되어야 한다. 

그런데 1byte의 데이터를 전송하고자 매번 40byte 이상의 헤더(TCP 헤더 크기: 20 ~ 60byte, IP 헤더 크기: 20byte, MAC/CRC를 제외하더라도 40byte 이상의 헤더가 필요)를 함께 전송하는 것은 효율적이지 못하다. 

이러한 문제점을 해결하고자 조금 더 효율적인 전송방식인 Nagle 알고리즘이 고안되었다. 

 

처음 도착한 키보드의 1byte는 그냥 보내고, 그 뒤로 1byte씩 데이터가 도착하면 그 데이터는 보내지 않고 우선 대기시킨다.

이후 상황은 두 개로 나뉜다.

1. 데이터가 *MSS만큼 쌓이면, 즉시 해당 패킷을 전송한다.

2. 가장 처음 보냈던 1byte에 대한 ACK이 도착할 때까지 데이터가 MSS만큼 쌓이지 않는다면, 데이터가 꽉 차지 않아도 해당 패킷을 전송한다.

 

 

*MSS: Maximum Segment Size(최대 세그먼트 크기), 대략 500byte

 

 

 

<수신 측에서 발생하는 신드롬>

  • Clark 해결방법

   - read 속도가 느려서 버퍼가 1byte씩 비워지는 상황.

   - 수신 버퍼가 MSS만큼, 또는 전체 버퍼크기의 1/2만큼 비어 있는 경우에만 상대에게 정상적인 응답(ACK)을 보내주고 그렇지 않을 경우 window size를 0으로 해서 전송(rwnd = 0)

   - Sender는 Receiver가 가리킨 곳에서 데이터 송신 stop (즉시 전송 중단. 받은 ACK의 rwnd가 0이기 때문에 Receive Buffer가 꽉 찼다고 판단해 데이터를 보내지 않음)

   - ACK 전송을 하기는 하는데, window size를 0으로 해서 전송

  • 확인응답의 지연

   - 일정 크기 이상의 empty space 생겼을 때만 ACK 보냄.

   - Sender는 rwnd 받은 만큼(window size만큼) 데이터를 보내고 stop (Clark 방법보다 데이터 전송이 조금 더 이루어짐)

   - ACK 전송을 아예 안 하고 미룸.

 

 

SYN Flooding = DoS (denial-of-service, 서비스 거부)

한꺼번에 여러 대의 컴퓨터에서 접속하는 경우, DDos(Distributed Denial of Service )

 

서버와 클라이언트의 통신

Client는 서버소켓에 SYN을 보내 서버 연결 요청을 한다. 서버가 SYN + ACK을 보내주면 Client는 연결 요청 대기 큐에 들어간다. 

Client에게서 ACK이 오면 Accept 함수가 리턴이 되어서 생성된 새로운 소켓과 Client가 연결되고, Client는 Server와 통신을 할 수 있게 된다.

새로 생성된 소켓과 Client1이 정보를 송수신하고 있는 도중 다른 Client가 연결을 요청하면, 해당 클라이언트를 연결 요청 대기 큐에 넣는다.

참고: 이전에 포스팅했던 글 중 서버-클라이언트 connection 이미지

 

 

SYN Flooding

서버는 클라이언트가 연결 요청을 했을 때 연결이 수락될 때까지 해당 클라이언트를 연결 요청 대기 큐에 집어넣는다. 클라이언트들은 연결 요청 대기 큐에 들어가서 연결을 기다린다.

클라이언트는 서버가 보낸 SYN + ACK을 받고 최종적으로 서버에 ACK을 전송해야만 서버와 연결이 가능하다. 따라서 클라이언트의 ip주소가 잘못된 경우 SYN + ACK이 엉뚱한 IP주소로 보내지고 서버는 클라이언트로부터 ACK을 받지 못하게 된다. 

 

RAW소켓은 헤더 정보들에 대해 프로그래머가 직접 제어할 수 있게 해주는 소켓이다. 즉, RAW소켓을 사용하면 IP헤더와 TCP헤더를 직접 제어할 수 있다. (출처: https://mangkyu.tistory.com/16 [MangKyu's Diary])

이를 악용하여 누군가 의도적으로 Client의 IP 주소를 변경해 서버에 여러 번 접속을 시도한다면, 서버가 SYN+ACK을 보낸 IP주소에서 ACK이 돌아오지 않으므로 클라이언트와 서버 간 연결이 정상적으로 이루어지지 않는다.

서버와 연결되지 못한 클라이언트가 대기큐에 쌓여 대기큐가 가득 차면 정상적으로 서버에 접속하고자 하는 사용자는 서비스를 이용하지 못하게 된다.

이러한 현상을 SYN Flooding(SYN 홍수), 또는 DDoS(denial-of-service, 서비스 거부)라고 한다. 

 


자료 출처:

  • TCP/IP Protocol Suite 4th Edition Slide
    (Behrouz A. Forouzan 저, McGraw-Hill, 2010)

 

서버-클라이언트 연결 참고: 

2021.10.01 - [CS/컴퓨터 네트워크] - 컴퓨터 네트워크: State transition diagram

 

컴퓨터 네트워크: State transition diagram

TCP: Transmission Control Protocol 3. State transition diagram TCP 연결요청 / 수락 과정 State transition diagram <연결> Client / Server 동작 및 상태 설명 (왼: 클라이언트 / 오: 서버) Passive open ..

florescene.tistory.com

 

 

SYN Flooding

Silly Window Syndrome

반응형
저작자표시 비영리 변경금지 (새창열림)

'Computer Science > 컴퓨터 네트워크' 카테고리의 다른 글

컴퓨터 네트워크 실습  (0) 2021.10.16
컴퓨터 네트워크: Congestion Control  (0) 2021.10.14
컴퓨터 네트워크: Error Control  (0) 2021.10.07
컴퓨터 네트워크: Windows in TCP  (0) 2021.10.01
컴퓨터 네트워크: State transition diagram  (0) 2021.10.01
컴퓨터 네트워크: A TCP Connection  (0) 2021.09.24
'Computer Science/컴퓨터 네트워크' 카테고리의 다른 글
  • 컴퓨터 네트워크: Congestion Control
  • 컴퓨터 네트워크: Error Control
  • 컴퓨터 네트워크: Windows in TCP
  • 컴퓨터 네트워크: State transition diagram
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 프로그래밍 N
        • Programming
        • C | C++
        • Java N
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    블로그 제작
    Jiraynor Programming
    프로젝트
    AWS
    ZeroCho
    강의내용정리
    bfs
    뉴렉처
    자바
    spring boot
    d3
    mysql
    SWEA
    리액트
    플러터
    컴퓨터네트워크
    Next.js
    클론 프로젝트
    타입스크립트
    자바스크립트
    React
    알고리즘
    프로그래머스
    웹사이트
    포트폴리오
    공식문서
    구현
    백준
    Til
    파이썬
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
컴퓨터 네트워크: Flow Control
상단으로

티스토리툴바