[네트워크] 전송계층 - TCP flow control

장현수·2023년 6월 12일
0

네트워크

목록 보기
7/11

flow control 흐름제어

Sliding Window

  • receive window가 기준
  • receive window = receiver가 처리할 수 있는 데이터의 양 = receive buffer의 남은 공간
  • 헤더의 필드에 window size 정보를 담아 보낸다
  • sender는 해당 공간이 넘지 않게 세그먼트를 보낸다

TCP persist timer

  • receive window size가 0인 경우 sender가 아무것도 보내지 않으면 rwnd를 알 방법이 없음
  • sender가 데이터 전송을 중단하는 것이 아니라, 작은 크기의 세그먼트를 지속적으로 전송하여 receiver 버퍼에 빈 공간이 있는지 알아봄

Nagle's Algorithm - 세그먼트의 크기 결정

  • 조금씩 여러번 전송하지 말고 모았다가 한번에 보내라
  • 패킷 전송 후 피드백 ACK가 올때까지 buffer에 쌓아두었던 데이터 전송
  • ACK가 도착하지 전에 buffer최대치를 채울 경우 아직 도착하지 않았더라도 전송
  • 데이터의 크기에 상관없이 헤더 크기는 고정. 작은 데이터를 보낼 때에도 패킷과 헤더가 필요하므로 오버헤드 발생
  • 따라서 데이터를 모아서 한꺼번에 보내는 방식 : 오버헤드 감소

Receiver의 동작 최적화

Clark's solution

  • receive buffer에 빈 공간이 세그먼트보다 작게 남았을 경우 그냥 윈도우 사이즈를 0으로 해서 보내라
  • 모았다가 한번에 줘라

Delayed ACK

  • 세그먼트를 받았을 때 그것에 대한 ACK는 500ms 기다렸다가 보내라
  • 기다리는 동안 다른 세그먼트가 들어오면 한번에 ACK 보낼 수 있음

connection management

TCP 3-way handshake

  • 클라이언트가 헤더의 SYN bit = 1로 설정하여 보내며 서버에 연결요청 (SYN msg)
  • 연결 가능할 경우 서버는 ACK, SYN bit = 1 로 설정하여 응답 (SYN ACK msg)
  • 클라이언트가 연결 확인, ACK bit = 1로 설정하여 송신
  • 세 번째 메세지부터 데이터를 담아 보낼 수 있음. SYN msg, SYN ACK msg는 control 메세지여서 헤더만 나감.

closing connection

  • close call 이 들어오면 클라이언트가 FIN = 1로 설정하여 보낸다
  • 서버는 ACK bit = 1로 설정하여 응답
  • 서버가 클라이언트에 FIN bit = 1을 담아 보내 연결 종료를 요청
  • 클라이언트는 ACK bit = 1을 담아 응답
  • 서버 소켓은 closed, 클라이언트는 마지막 ACK가 유실되었을 경우를 대비해 일정 시간 여유를 두고 closed한다
profile
개같이 발전하자 개발

0개의 댓글