Computer Network-03.Transport Layer(TCP)

CHO WanGi·2023년 12월 7일
0

Network

목록 보기
3/11

Overview

  • 1대1 통신(point-to-point)
  • 신뢰성보장 : 재전송을 통한 신뢰성 보장
  • 순자 바이트 스트림(in-order byte Stream) : 어플리케이션 쪽에서 보면 하나의 스트림이 바이트 단위로 쭈욱 들어오는 것 처럼 보임
  • full duplex data : 같은 연결 안에서 양방향 통신 가능(MSS : Maximum segment size)
  • cumulative ACK's : TCP가 unreliable 한 IP 통신에 신뢰성을 더하기 위해 사용하는 방식(재전송 타이머)
  • Pipelining : ACK 없이도 window를 통해 혼잡제어 및 흐름 제어
  • Connetion-oriented : 연결 지향적, handshaking 을 통해 데이터 교환 이전 양쪽의 상태 control 메시지를 교환
  • flow controlled : 수신측의 버퍼 처리 속도보다 빠르게 수신하지 않음

TCP Segment Structure

총 20byte로 구성(32bits(=4bytes) * 5)

  • source port#, dest port# : 송/수신측 포트 넘버

  • sequence number : 전체 데이터 스트림 중 몇 번째 인지 알려주는 넘버

    segment's data의 첫번째 byte

  • acknowledge number: 수신측이 다음으로 받을 시퀀스 넘버이자 특정 번호까지 잘 받았다는 응답(누적 ACK 활용)

    acknowledgement : 수신측이 다음으로 받을 byte

  • Flags(U,A,P,R,S,F): 1 비트 플래그, U 와 P는 사용 안함, R,S,F는 TCP 연결 관리에 사용

  • A : acknowledge number 의 유효성 검사시 사용

  • RST(R) : RESET, 연결 재설정 표시

  • SYN(S) : 연결 시작시 사용

  • FIN(F) : 연결 종료시 사용

  • Receive Window : 흐름제어에 사용, 수신버퍼의 남은 공간의 크기를 적어 송신자에게 알려줌, 송신자는 이를 보고 unACKed 의 데이터 크기가 이 필드의 값을 넘지 않도록 하여 오버플로우를 방지

  • checksum : 에러 체크 용도

TCP Round Trip Time, timeout

TCP의 RTT를 적당히 설정해둘 필요성 존재
너무 길면 segment 손실에 대응이 느리고, 너무 짧으면 타이머가 일찍 종료되어 불필요한 재전송이 발생

Estimated RTT

  • sample RTT : ACK받을때까지 걸리는 시간의 평균값.(재전송 무시)
  • Estimated RTT : sample RTT들의 평균값

TCP Sender & Recevier events

  • 송신측 이벤트
  1. 어플리케이션 계층에서 데이터 스트림 수신
  2. 최대 전체 데이터 스트림(MSS)의 세그먼트 생성, 이 새그먼트는 첫번째 데이터 바이트의 시퀀스 넘버를 가짐
  3. 타임아수 발생시, 타임아웃을 발생시킨 세그먼트를 재전송하고 타이머를 재작동
  4. 수신 받지 못한 세그먼트의 ACK수신시 다음으로 어떤 ACK을 받아야하는지 업데이트, 받을 세그먼트가 있다면 반복
  • 수신측 이벤트
  1. 정상적인 순서대로 시퀀스 넘버가 수신된 경우 이전 세그먼트 역시 모두 ACK이 되면, 바로 보내는 것이 아니라 최대 500ms 만큼 기다렸다가 ACk 보냄(delayed ACK)
  2. 그 사이에 다음 세그먼트가 수신 되지 않으면 ACK 전송
  3. delayed ACK 하는 동안 다음 세그먼트를 수신받으면 누적 ACK를 전송

1-2. 비 정상적 순서대로 세그먼트를 기대한 값보다 큰 시퀀스 넘버 수신시, 즉시 duplicated ACK전송(다음 예상 바이트의 시퀀스 넘버)

TCP flow Control

수신측이 송신측을 control, 따라서 송신측이 수신측의 버퍼처리속도 보다 더 빠르게 데이터를 보내지 않는 것

수신 버퍼의 담은 공간을 Rwnd(Receive Window), 이 공간의 크기는 전체 공간에서 buffered-data 만큼의 공간을 빼면 됨.

수신자는 TCP 세그먼트 헤더에 남은공간의 크기를 적어 송신자에게 알려주고,
송신자는 unACKed 데이터의 크기가 Rwnd 의 값을 넘지 않도록 조절함.
수신측은 ACK을 받지 않고 보낼 수 있는 데이터의 크기인 window 값과 RcVWindow 값 중 가장 작은 것으로 제한.

TCP Fast Retransmit

만약 송신측이 중복된 ACK을 3번 받았을때, 바로 재전송을 하는 기능.

TCP Connection Management

TCP의 송신과 수신측은 데이터 세그먼트들을 주고 받기 전 연결(handshake)을 맺음,
이때 시퀀스 넘버, 버퍼 사이즈, 흐름제어 관련 변수들이 초기화 되어 설정

수신측(서버)는 특정 포트번호를 보내어 소켓 생성, welcomeSocket을 갖고 송신(클라이언트)측 요청에 대기.
클라이언트는 소켓 생성시 연결한 서버의 ID, port#을 주면 바로 서버의 welcomeSocket을 갖고 three-way handshaking을 시작.

수신측은 송신측으로 부터 요청이 오면, 이데 대흥하는 한개의 소켓(connection socket)을 생성하여 클라이언트와 연결, 연결 완료시 데이터 전송은 수신측(클라이언트)의 소켓과 송신측(서버)의 연결 소켓 간 직접 이루어진다.

TCP 3-way handshake

1단계, 클라이언트 -> 서버(SYN)
클라이언트는 SYNbit 가 1로 설정된 TCP SYN 세그먼트를 서버로 전송.
이때 시퀀스 넘버를 지칭하여 보냄(X), 데이터는 포함하지 않음
state를 SYNACK을 기다리는 SYNSENT 상태로 변경

2단계 서버 -> 클라이언트(SYNACK)
서버에는 SYN 세그먼트 요청을 받고 TCP연결을 수락하면 TCP와 버퍼 변수를 설정.
응답으로 SYNACK(SYN bit: 1, ACK bit:1) 세그먼트를 클라이언트로 보냄.
시퀀스 넘버는 클라이언트의 시퀀스 넘버에 1을 더해서 보냄

3단계 클라이언트 -> 서버(ACK)
클라이언트는 SYNACK 세그먼트를 수신하면 응답으로 데이터를 포함하는 ACK 세그먼트(SYN bit: 0, ACK bit:1)을 보냄

TCP Congestion Control

흐름 제어를 통해 송신-수신자의 일대일 사이간 패킷 수를 조절했다면,
혼잡제어는 전체 네트워크 내의 패킷 수를 조절하여 네트워크의 overflow를 방지.

AIMD(Addictive Increase Multicative Decrease)

혼잡 회피 방식의 첫번째 방법으로 AIMD(합 증가, 곱 감소) 알고리즘이 있다.
더할때는 증가시키고, 반으로 줄여 감소시킨다.

송신자, 처음에 하나의 패킷을 전송. 문제가 없다면 2개를, 3개를... 이렇게 늘려나가다가 패킷이 전송되자 않거나 타임아웃 발생시 윈도우 사이즈를 절반으로 감소 시킨다.

모든 호스트가 공평히 네트워크를 사용하지만, 초기 네트워크의 큰 대역폭을 바로 사용하지 못하며, 혼잡 상태가 발생한 다음에 대역폭을 감소시킨다는 단점이 존재

slow start

느린 시작이지만 시작부터 빠르게 윈도우를 증가시키고 특정 시기가 오면 윈도우를 확 줄이는 방식

AIMD와 마찬가지로 처음엔 하나의 패킷을 보내고 그다음 2개, 4개,8개...즉 윈도우 사이즈를 두배씩 증가시키다가,
혼잡 현상 발생시 윈도우 사이즈를 1로 줄여버리는 것.

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글