본문 바로가기

컴퓨터 네트워크

컴퓨터 네트워크 : 15. Transmission Control Protocol(TCP)

1. TCP services

  • TCP(Transmission Control Protocol)Application layer와 network layer 사이에 있으며 application과 network의 작업 사이의 중간 역할을 한다.
    Transport layer 내에 있는 프로토콜 중 하나

TCP/IP 프로토콜 suite의 다른 프로토콜에 대한 TCP의 관계

<잘 알려진 Port 번호>

Port Protocal Description
7 Echo 수신된 datagram을 보낸 사람에게 다시 반향시다.
9 Discard 수신된 모든 datagram을 폐기
11 Users 활성 사용자
13 Daytime 날짜 및 시간을 반환
17 Quote 오늘의 quote를 반환
19 Chargen 문자열을 반환
20 and 21 FTP 파일 전송 프로토콜(데이터 및 제어)
23 TELENT 터미널 네트워크
25 SMTP 단순 메일 전송 프로토콜
53 DNS 도메인 이름 서버
67 BOOTP Bootstrap Protocal
79 Finger Finger
80 HTTP Hypertext Transfer Protocal(Web Server)
Port number는 16비트(2바이트) 정수형을 사용기 때문에 0 ~ 65535번까지 사용할 수 있다. 
<Port number 영역>
0 ~ 1023 : well-known port번호 영역 → UNIX/LINUX에서 루트 권한으로만 열 수 있음
1024 ~ 49151 : 등록된 포트(registered port) → 주로 서버 소켓으로 사용하는 영역
49152 ~ 65535 : 동적 포트(dynamic port)client가 connect(2) 시 또는 bind(2) 없이 server socket을 생성하여 listen(2)할 경우 자동으로 할당되는 영역 

1) Stream delivery

  • TCPstream delivery를 사용 ( ⇔ UDP : Boundary delivery )
Stream delivery : application에서 만들어진 데이터들의 boundary(경계)를 유지하지 않고 다른 단위로 잘려서 전송
→ TCP의 경우 Byte 단위로 잘라서 전송하기 때문에 Stream of bytes라고 함
Boundary deliver : application에서 만들어진 데이터들의 boundary들이 유지되는 상태로 뭉쳐져 전달되는 형태

 

2) Sending and receiving buffers

  • TCP양방향으로 전송할 수 있다. 따라서 각 프로세스는 실제로는 Sending bufferreceiving buffer를 둘 다 가지고 있음

(1) Sending buffer 영역

1. Sent 영역 : 버퍼가 데이터를 보낼 때 만약 특정 부분이 제대로 전달되지 않았다면 buffer가 프로세스에게 데이터를 다시 요청해야하는데 대신에 buffer 자체가 보낸 데이터에 대한 copy를 하여 저장한 영역

2. Not sent 영역 : 버퍼가 아직 보내지 않은 데이터들이 담겨 있는 영역

3. Empty 영역 : 프로세스에게서 받을 데이터를 담기 위한 비어있는 영역

(2) Receiving buffer 영역

1. Not read 영역 : 프로세스가 아직 읽지 않은 패킷(segment)들을 저장하는 영역

2. Empty 영역 : 패킷을 받았을 때 저장할 수 있는 비어있는 영역

 

2. TCP Features

1) Numbering System

  • 각 연결에서 전송되는 데이터의 바이트 수는 TCP로 번호 매겨진다.
  • numbering은 임의의 생성된 번호로 시작

(1) Example

  • (문제) TCP 연결이 5,000 바이트의 파일을 전송한다고 가정하자. 첫번째 바이트의 번호는 10,001이다. 데이터가 각각 1,000 바이트씩 5개의 세그먼트(segment)로 전송되는 경우 각 세그먼트의 sequence number는 무엇이냐?
  • (해결) 다음은 각 세그먼트의 시퀀스 번호를 보여준다.

Sequence Number : 세그먼트의 sequece number field에 저장된 값으로 해당 세그먼트에 포함된 첫 번째 데이터 바이트에 할당된 번호
Acknowledgment Number
: 세그먼트의 acknowledgement number field에 저장된 값으로 상대방으로부터 받아야하는 다음 TCP 세그먼트 데이터 시작 번호
→ Acknowledgment Number를 통해 어디까지 받았는지를 내포함

(2) TCP ACK의  두 가지 방법

Selective ACK : ACK가 가장 최근에 받은 세그먼트의 sequence number을 가짐
                             (장점) - sender에게 순서에 어긋난 데이터를 알려줌
                             (단점) - 패킷 크기가 커짐
Cumulative ACK : ACK가 다음에 받아야 할 세그먼트의 sequence number를 가짐
                                (장점) - sender측 윈도우 조정 용이
                                (단점) - packet loss 이후의 상황을 자세히 알 수 없다.

3. SEGMENT

  • TCP에서 Packet을 segment(세그먼트)라고 한다.

1) TCP segment format

  • 세그먼트는 20 ~ 60바이트 크기의 헤더Data로 구성
  • 세그먼트 헤더는 아래 그림처럼 구성
    • Options and padding(노란 부분)을 제외하고 각 행이 4byte씩 20byte가 기본적으로 할당
    • Options and padding은 0 ~ 40byte 크기를 가질 수 있고 세그먼트에 따라 다름
1행 : Src/Des port address : 16비트(2바이트)씩 차지
2행 : Sequence number : 32비트(4바이트) 차지
3행 : Acknowledgment nubmer : 32비트(4바이트) 차지 → 보통 ACK이 갈 때는 ack number가 없음
4행 : 1) HELN : 헤더의 길이를 저장
                          → 길이/4를 저장(헤더는 20 ~ 60이므로 HLEN은 5 ~ 12의 범위만 있으면 되기 때문에 4비트 할당)
         2) Reserved : 6비트 차지 → 예약, 예비
         3) Control field : 6개의 flag를 6비트에 저장
         4) Window size : 16비트(2바이트) 차지 → TCP의 Window 풀을 나타냄(수신 Window)
5행 : 1) Checksum : 16비트(2바이트) 차지 → TCP에서 필수
                                   → checksum 이외의 모든 값을 sum 한 후 → 보수 값을 사용
         2) Urgent pointer : 16비트(2바이트) 차지

세그먼트 구성과 세그먼트 헤더의 구성

(1) Control field

1. URG : Urgent pointer is valid

2. ACK : Acknowledgment is valid(헤더에 ACK이 포함된 건지를 나타냄 → 유효하면 1로 SET)

3. PSH : Request for push

4. RST : Rest the connection

5. SYN : Synchronize sequece numbers(연결 요청)

6. FIN : Terminate the connection(연결 종료)

(파란색 위주로만 다룰 예정!!!)

(2) Pseudoheader added to the TCP segment

  • Pseudoheader는 IP 헤더 안에 존재

(3) Checksum

  • Checksum : 중복 검사의 한 형태로, 송신된 자료의 무결성을 보호하는 단순한 방법
                         → 나열된 데이터를 더하여 Checksum 숫자를 얻고, 정해진 비트 수의 모듈라로 정해진 비트수로 재구성
    • 단점 : 완전히 오류 감지는 못함 → 오류가 있어도 Checksum이 정상일 수 있
  • CRC(cyclic redundancy check) : TCP/IP, Mac 등의 계층에서 오류검증으로 사용
    송신자가 checksum 계산해서 헤더에 넣은 값을 수신자가 다시 checksum을 계산했을 때랑 같으면(0이 되면) 오류가 없는 것
    • CRC는 Frame header를 제외한 header들에서 에러를 detect(감지)하는 역할

Encapsulation : PC에서 다른 PC로 데이터를 전송할 때 데이터를 패키지화 하는 과정

<에러 감지 순서>

1. IP 헤더에서 checksum을 계산(IP header만 오류 체크)

2. TCP 헤더에서 checksum을 계산(TCP header와 application을 포함한 오류 체크)

TCP에서 checksum의 사용은 mandatory(필수)이다.

sender에서 checksum calculation 예제

4. A TCP connection

  • TCPconnection-oriented(연결지향적)이다. ( ⇔ UDP비연결지향적이다)
    → source와 destination 사이에 virtual path를 설정한다.
    → message에 속한 모든 segment가 이 virtual path를 통해 전송된다.
  • TCP higer level(더 높은 수준)에서 작동
  • TCP는 IP 서비스를 사용하여 개별 세그먼트를 receiver에 전달하지만 연결 자체를 제어한다.
  • 세그먼트는 손실되거나 손상되면 retransmit(재전송)된다.
※ connectionless 프로토콜인 IP의 서비스를 사용하는 TCP가 어떻게 연결 지향적일 수 있을까?
- 요점은 TCP 연결이 물리적인 것이 아니라 virtual(가상)이라는 점!!!

1) three-way handshake를 사용한 Connection establishment

  • Three-way handshake : TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정
    → 신뢰성 보장을 위해 다음의 과정을 거침
    1. Client → SYN → Server  : Client가 Server에게 접속 요청하는 SYN 플래그를 보낸다
    2. Server → SYN + ACK → ClientServer가 Listen 상태에서 SYN이 들어온 것을 확인하고 SYN_RECV상태가 됨
                                                            → SYN+ACK 플래그를 Client에게 전송
                                                            → Server는 ACK을 받기 위해 대기 상태로 변경
    3. Client → ACK → Server : SYN + ACK 상태를 확인한 Client는 서버에게 ACK을 보내고 연결 성립(Established)
SYN 세그먼트 : 연결 요청 패킷 → 데이터를 전송할 수 없지만, 하나의 sequence number를 사용
ACK 세그먼트 : 응답 패킷 → 데이터를 전송하지 않는 경우, sequence number를 사용
SYN + ACK 세그먼트 : 데이터를 전송할 수 없지만, 하나의 sequence number를 사용

Three-way handshkae in connection esatblishment

 

socket : 소켓을 생성하는 함수
bind : 소켓에 IP, Port 번호를 부여하는 함수
listen : 일반 소켓에서 서버 소켓으로 바꿔주는 역할 
            → listen을 호출해야 SYN이 왔을 때 SYN과 ACK을 자동으로 전송
connect : connect함수를 실행하면 자동으로 SYN을 보냄 
                → block 함수라서 ACK이 올 때까지 대기 후 반환
accept : 연결 요청에 대한 수락을 하는 함수
              → block 함수라서 ACK이 올 때까지 대기 후 반환

2) Data Transfer

  • 데이터 전송을 하기 위해 1000 Byte 씩 2번 SYN을 보냄
    (8001 → 9000, 9001 → 10000)
  • Server에서 ACK이 10001이고 데이터를 포함한 패킷을 전송
  • 이후 전송할 데이터가 없다면 종

3) Three-way handshake를 이용한 Connection termination

  • TCP 연결 종료는 TCP 연결 설정보다 복잡
    → 여러 종료 상황이 존재할 수 있음
    → 한 방향 연결이 종료되어도, 다른 방향은 계속 오픈 상태일 수 있음
  • 정상 종료인 경우, TCP 연결 종료는, 양방향 2개 연결을 각 축이 독립적으로 닫게 됨
    → FIN 및 그에 대한 FIN+ACK 의 2쌍을 통해서
    → 따라서 three-way handshake로 진행됨
  • Three-way handshake를 이용한 connection termination
    1. Client → FIN → Server : 클라이언트측 어플리케이션이 종료되면 Server로 FIN 송신 후 FIN_WAIT 상태가 됨
    2. Server → FIN + AKC → Client : FIN을 수신 후 CLOSE-WAIT 상태가 됨
                                                          → 서버측 어플리케이션이 종료가 시작되면 Client로 FIN + ACK 송신
                                                          → 서버는 LAST-ACK 상태가 됨
    3. Client → ACK → Server : FIN을 수신한 Client에서 Server로 ACK을 전송
                                                → Client는 ACK을 보내고 TIME-WAIT 상태로 최대 세그먼트 수명의 2배를 기다린 후                                                 CLOSED 상태가 됨
                                                → Server는 ACK을 수신하면 CLSOED 상태가 됨
FIN 세그먼트 : 연결 종료 패킷 → 데이터를 전송하지 않는 경우, 하나의 sequence number를 가짐
FIN + ACK 세그먼트 : 데이터를 전송하지 않는 경우, 하나의 sequence number를 가짐

(1) TCP 연결 종료 구분

1. 정상 종료(Normal Close) : 3단계 handshake에 의해 양방향 모두 종료되는 것

2. 반 종료(Half Close) : 양측이 동시에 회선 종료되지 않고, 한쪽 연결이 열린채로 놔두고 종료하는 것
                                      → 즉, 송신은 가능하지만 수신은 불가능 또는 수신은 가능하지만 송신은 불가능

    - 클라이언트가 항상 FIN을 먼저 보냄FIN을 보낸 순간 클라이언트에서 서버를 전송될 데이터는 없음!!!

                                                                → 서버에서는 클라이언트로 보낼 데이터는 있을 수도 있음!!!! 

    - 따라서 클라이언트가 FIN을 보내면 half clase 상태 → 따라서 receive buffer는 여전히 남아 있음

                                                                                             (이유) 서버에서 올 데이터가 있을 수도 있어서!!

3. 동시 종료(Simultaneous Close) : 거의 동시에 양측에서 FIN 세그먼트를 보내는 경우

4. 강제 종료 : TCP Reset 요구(RESET 세그먼트) 기능

 

4) 전체 TCP 전송 과정

 

5. State Transition Diagram

1) States for TCP

State Description
CLOSED 연결이 없는 상태
LISTEN Passive open received; SYN 대기중
SYN-SENT SYN 전송; ACK 대기중
SYN-RCVD SYN+ACK 전송; ACK 대기중
ESTABLISHED Connection established(연결 설정); 데이터 전송이 진행 중
FIN-WAIT-1 첫번째 FIN 전송; ACK 대기중
FIN-WAIT-2 첫번째 FIN에 대한 ACK이 수신; 두번째 FIN 대기 중
CLOSE-WAIT 첫번째 FIN 수신, ACK 전송; 응용프로그램 종료 대기
TIME-WAIT 두번째 FIN 수신, ACK 전송; 2MSL time-out 대기
LAST-ACK 두번째 FIN 전송; ACK 대기중
CLOSING 양쪽이 동시에 close 상태로 변경
FSM(finite-state machine)에서 ESTBLISHED로 표시된 상태는 사실 클라이언트와 서버가 데이터를 전송하기 위해 겪는 두 가지 상태 집합이다.
MSL : Maximum Segment Lifetime(30초 ~ 1분 정도)

2) State transmition diagram

(1) 서버 : LISTEN →(SYN 수신&SYN+ACK 송신)→ SYN-RCVD →(ACK 수신)→ ESTABLISHED →(FIN 수신&ACK 송신)→ CLOSE-WAIT →(FIN 송신)→ LAST-ACK →(ACK 수신)→ CLOSED

(2) 클라이언트 : SYN-SENT →(SYN+ACK 수신&ACK 송신)ESTABLISED →(FIN 송신)→ FIN-WAIT-1 →(ACK 수신)→ FIN-WAIT-2 →(FIN 수신&ACK 송신)→ TIME-WAIT →(2MSL만큼 대기)→ CLOSED 

3) Time line for a common scenario

RTT(Round Trip Time, 왕복 시간) : 패킷을 목적지로 보낼 때, 패킷이 목적지에 도달하고 나서 해당 패킷에 대해 ACK이 출발지로 다시 돌아오기 까지의 시간 → RTT는 거리마다 다름

<Time wait이 있는 이유>
1. FIN, FIN+ACK, ACK에서 마지막 ACK이 없어졌다고 가정
    → 마지막 FIN이 Loss 됬다고 간주하고 Server에서 다시 FIN 세그먼트를 재전송
    → 만약 time wait이 없고 closed되면 client는 재전송된 FIN을 수신받지 못함
    → 따라서 Server는 ACK을 수령하지 못해 서버 연결 종료를 하지 못함
    ⇒ Time wait 동안 기다리면서 FIN 재전송이 되는지를 기다림
2. 서버에 연결을 종료하고 약간의 시간 후 재접속을 한다고 가정
    → 똑같은 IP와 Port 번호를 가진 소켓이 다시 만들어져 패킷이 복잡해질 수 있다.
    ⇒ 기존 connection port를 2MSL동안 살려놓고 다시 SYN이 오면 다른 port번호로 대체한다.

(1) Eco server 코드(반사하는 코드)

  • Read : receive buffer에 들어온 데이터를 애플리케이션에 가져 오는 것
                → 데이터가 없으면 block 상태가 되고 데이터가 올 때까지 wait
  • while문 종료 조건 : read가 0을 반환하는 경우 → 상대가 FIN을 보냈을 때
  • clnt_sock : 연결 요청만 받는 소켓

4) Denying a connection

  • SYN이 오면 RST를 통해서 패킷 거절

5) Aborting a connection

  • RST + ACK을 동시에 전송 → 종료될 때 강제 종료 등의 경우가 생기면 RST + ACK을 전송해 client-server가 모두 즉시 CLOSED 상태가 됨

6) 1 : N = Server : Client의 경우

  • 녹색 점(서버 소켓) : SYN/SYN+ACK을 Client와 주고 받는 역할 → SYN을 받으면 소켓을 새로 생성하여 각 Client와 연결
    ※실질적으로 Client는 녹색 점에 데이터를 보내고 패킷의 헤더를 통해 각 소켓으로 전달하는 형식※
  • File descriptor : 0, 1, 2는 고정 3에 녹색 점(서버 소켓) / 그 이후에 생성된 소켓들이 할당됨

 

6. Windows in TCP

  • TCP는 각 데이터 전송 방향에 대해 두 개의 windows(send window와  receive window)를 사용한다.
    → bidirectional communcation(양방향 통신)을 위한 four windows 
  • 논의를 단순화하기 위해, 우리는 통신이 단방향일 뿐이라고 가정!!!!
Stop & Wait 방식 : 한번 데이터를 보내면 ACK을 받을 때까지 기다리고, ACK이 도착해야만 다음 데이터를 한번 보내는 방식
Window : sender가 보낼 수 있는 maximum 데이터 크기
                 → 상황에 따라 데이터가 소비되는 속도가 다르기 때문에 빈 공간은 때에 따라 다름
                 → 따라서 reciever는 sender에게 계속 window size를 알려줘야 함 (헤더에 존재)

1) Send window in TCP

  • send window sizereceiver가 보내준 window size(한 번에 보낼 수 있는 패킷의 크기)
    → receiver가 5개 window size를 받으면 방금 보낸 패킷 빼고 남은 거 보냄
  • sending buffer의 window : 보낸 데이터에 대한 ACK이 오면 keep해놓고 있던 데이터를 버리고 window를 전체적으로 오른쪽으로 이동
      1. Closing : sender가 ACK 번호를 보고 상대방이 어디까지 받았는지를 확인하고, 상대방이 다 받았다면 더 이상 keep 할 필요가 없으니 반납하고 빈공간을 만든다.
      2. Opening : 데이터가 receiver에서소비되어 보낼 수 있는 양이 늘어나면 right wall이 오른쪽으로 더 이동

주황색 부분 : 보냈지만 ACK을 아직 받지 못함 / send window : 상대방이 알려준 rwnd 만큼 세팅

2) Receive window in TCP

  • receiver window size는 할당된 buffer보다 클 수 없다.
    → buffer에서 읽히기를 기다리는 Byte의 수 = Receiver window size(rwnd)
  • receiving buffer의 window: 받은 데이터를 소비하고 나면 빈 공간은 버리고 window를 전체적으로 오른쪽으로 이동
    1. Closing : sending buffer로부터 데이터를 받은 만큼 left wall은 close된다.
    2. Opening : 데이터가 receiver에서 소비된만큼 right wall이 오른쪽으로 이동하여 window가 열린다.

201 ~ 260이 소비되었다면 left wall을 right wall로 이동하고 right wall은 받은 rwnd로 만큼으로 지

 

7. Flow Control

  • Flow Control :  prodcuer(생산저)가 데이터를 생성하는 속도와 consumer(소비자)가 데이터를 사용할 수 있는 속도의 균형을 맞춘다.
    • TCPflow control과 error control를 분리힌다.
    • error control를 무시한 flow control를 다룰 것이다.
    • 송신과 수신 사이의 logical channel이 오류가 없다고 가정!!

1) Sliding Window

  • Sliding Window : window의 크기를 가변적으로 조절하여 필요에 따라서 window의 크기를 크게(줄일 수도 있지만 다루지 않음)해서 여러 패킷을 논리적인 하나의 패킷으로 묶어 전송
  • rwnd : receiver window size(수신 측 버퍼 여유 용량)
    → receiver application이 가져가는 속도에 맞춰서 변동
  • cwnd : congestion window size(송신자가 보낼 수 있는 패킷 크기의 한계)
    → 연결 초기 및 혼잡 상황에서 사용되는 윈도우
    연결 초기cwnd = 1로 셋팅
    → 최대값이 될 때까지 cwnd를 증가 시킴

Shrinking은 다루지 않음

2) TCP/IP protocol suite

sender 프로세스 → sender TCP : write 함수를 사용하여 데이터를 buffer에 저장

sender TCP → receiver TCP : 세그먼트를 sender에서 receiver로 전송

receiver TCP → receiver 프로세스 : read 함수를 사용하여 buffer에서 application을 데이터 가져오고 버퍼 비워

receiver TCP → sender TCP : Flow control feedback 

sender TCP → sender 프로세스 : Flow contorl feedback 

※ Receiver가 소비하는 속도 ⇒ Network 속도

Flow control feedback : 상대 destinatino의 receiving 버퍼가 소비되는 속도를 고려하여 그에 맞춰 TCP가 보내는 패킷의 양을 조절하는 것!!!
Ex) 이미지 파일 같이 큰 파일을 보내려고 할 때
이미지 용량이 buffer보다 크면 write()에서 block된다. 따라서 상대방이 정보를 가져가야 block이 풀리고 TCP가 또 새로운 데이터를 갖다놓음
※ 수신 프로세스가 수신할 준비가 되어 있을 때마다 수신버퍼도 Data를 읽어간다.
수신 TCP가 송신 TCP 제어, 송신 TCP는 송신 프로세스를 제어

sender와 receiver 사이의 unidirecctional(단방향) 데이터 전송을 보여줌

3) Example of Flow Control

  • client에서 server로의 단방향 통신에서만 고려할 것 → 따라서 window가 하나밖에 없는 것!!

<아래 예시 설명>

1. 클라이언트-서버 연결 요창

   1) 클라이언트가 서버에 연결 요청 패킷을 전송

   2) 서버가 SYN+ACK 패킷을 보내준다. 해당 패킷에는 rwnd = 800이라는 값이 적혀있음
        → ACK number 값은 101

   3) 클라이언트가 해당 SYN 패킷에 대한 ACK 패킷을 보내준다.

2. 데이터 전송

   4) 이제 데이터를 101번부터 200byte씩 전송한다.

        → 이때 Sending buffer는 아직 변화 없음 

        → Receiving buffer는 200Byte를 받았으니 200만큼 줄어든다.

   5) 서버가 이제 600Byte 남았으므로 ACK 패킷에 rwnd값으로 600을 보내준다.
        → 클라이언트가 101~301까지 보낸 데이터에 대한 ACK을 받았으므로 해당 window는 301번까지 window를 close함

   6) 이제 클라이언트가 다시 301번부터 300Byte를 보낸다.
        → 이때 서버가 300Byte를 받고, 100Byte를 소비했으므로
        → left wall은 300Byte만큼 close하고 right wall을 100Byte만큼 open함

   7) 이제 서버가 다시 300Byte에 대한 ACK 패킷에 rwnd값으로 400을 보내준다.

        → 이제 sending buffer는 300byte를 제거하고 뒤에 100Byte만큼 open함

   8) 마지막으로 서버가 스스로 200Byte를 소비하여 receiving buffer의 window가 #601 ~ #1201까지 open됨

        → 이제 rwnd값이 늘어났다고 ACK 패킷을 sending buffer로 rwnd = 600만큼 전송

        → sending buffer는 뒤에 200Byte만큼 open

4) Silly Window Syndrome

  • 송신 측 Silly Window Syndrome : Header의 크기(40Byte)에 비해 데이터가 너무 작을 경우 발생하는 비효율성
    → 송신 TCP가 한 번에 1 Byte씩 데이터를 천천히 발생하는 응용 프로그램의 경우
    → 1 Byte 데이터를 포함한 세그먼트가 만들어짐
  • 수신 측 Silly Window Syndrome : 수신 TCP에서 소비하는 데이터 양보다 송신 TCP에서 보내는 양이 더 많을 때 발생하는 비효율성

(1) 해결책 : 가능한 큰 byte를 보내자 but, 너무 오래 대기하는 것도 손해

  • Nagle 알고리즘(송신 쪽 해결)
    ① 보낼 데이터가 MSS(Maximum segment size → 보통 536Byte)로 정의된 크기만큼 쌓이면, 무조건 전송
    ② MSS보다 작을 경우, 이전에 보낸 데이터의 ACK이 오기를 기다림
        → ACK이 도달하면 보낼 데이터가 MSS보다 작더라도 전송
        → ACK이 오기전 MSS만큼 쌓이면 전송
    ※ default값은 Nagle ON상태이다.

  • Clark 해결방법(수신쪽 해결1)
    - receiver buffer에 공간이 매우 작을 때, ACK 전송 시 window size = 0으로 전송하여 빈 공간이 MSS 크기가 되거나 buffer의 절반일 때 다시 수신하는 방법
    (단점) rwnd = 0으로 보내는 도중에 데이터가 계속 들어올 수 있음 → 최악의 경우 데이터가 버려질 수 있음
  • 확인응답의 지원(수신쪽 해결2)
    - 일정 크기 이상의 empty space가 생길 때까지 ACK 전송 지연하는 방법

5) SYN Flooding

  • SYN Flooding : Client가 보내는 곳의 IP와 Port 번호를 악의적으로 바꾸어서 SYN을 여러개를 보내 연결 요청 대기 큐가 꽉차서 제대로 된 사용자가 SYN을 보낼 수 없게 되는 현상
    • 공격자가 서버에 연결 요청 
      → 서버는 연결 요청에 응답(SYN + ACK) 전송 
      → 공격자가 ACK을 보내지 않음, 서버 연결 요청 대기 큐에 저장
      → 위의 과정을 계속 반복하여 연결 요청 대기 큐가 꽉참
      → 서버 터짐
    • DDos : 여러 개의 컴퓨터를 감염시켜 동시에 타깃 컴퓨터에 공격하여 SYN Fooding을 발생시키는 것

 

8. Error Control

  • TCP 신뢰할 수 있는(reliable) transport layer protocol이다. 즉, TCP에 데이터 스트림을 전달하는 애플리케이션 프로그램은 TCP에 의존하여 전체 스트림을 다른 쪽 끝의 애플리케이션 프로그램과 오류 없이, 어떤 부분도 손실되거나 중복되지 않고 순서대로 전달한다!!!
    • TCP에서 Error control : checksum, acknowlegment 및 time-out의 세가지 도구를 사용하여 수행됨
ACK 세그먼트는 sequence number를 사용하지 않으며 승인되지 않음 → ACK에 대한 ACK은 없다
데이터가 비정상적으로 도착하여 수신 TCP에 의해 일시적으로 저장될 수 있지만, TCP는 순서에 맞지 않는 데이터는 프로세스에 전달되지 않도록 보장

1) Normal operation

  • Rule 1 : 받은 데이터에 ACK을 보낼 때 Sending buffer에 보낼 데이터(수신하고자 하는 다음 순서 번호인 Sequence number)가 있으면 같이 보내는
  • Rule 2 : 데이터를 받아서 ACK을 보내려고 할 때 Sending buffer에 보낼 데이터가 없으면 최대 50ms만큼 기다리고 보내는 것
  • Rule 3 : Rule 2에서 기다리다가 패킷하나가 더 오면 바로 ACK 전송
                  → packet 2개를 받으면 즉시 ACK 1개를 보낸다.

2) Lost segment

  • Rule 4 : 순서에 어긋나는(out-of-order) 세그먼트가 오면 즉시 ACK을 보냄
                  → 수신측은 ACK 세그먼트를 즉시 전송함으로써 sequence number를 알림
  • Rule 5 : 누락된 세그먼트가 도착하면 수신하고자 하는 다음 sequece number를 담은 ACK 즉시 전송
수신 TCP는 순서가 지정된 데이터만 프로세스에 전달
→ 순서가 바껴서 들어오는 데이터를 TCP가 알아서 해결 (⇔ UDP는 신경 쓰지 않음)
신뢰성 보장이 필요한 경우에는 TCP를 사용!!!(대부분 TCP 사용)

 

(1) Fast retransmission

  • Fast retransmission : 3개의 중복된 ACK이 도착하면 Packet loss로 간주하고 해당 패킷을 재전송함.
    • 양방향으로 전송하기 때문에 중복된 ACK이 실제로는 3개 이상이 올 수있다.
    • window size가 허락하는 한 Client는 계속해서 데이터를 보낼 수 있다.

(2) Lost Acknowledgment

  • ACK이 안 왔지만 window size가 허락되면 계속 SYN을 전송하게 됨
  • 따라서 아래의 경우 아무 문제없이 진행됨

  • Rule 6 : 중복된 세그먼트를 받으면 수신측은 즉시 폐기하고, 수신하고자 하는 순서에 맞는 즉시 ACK을 전송
  • 아래의 경우 보낼 데이터가 없는 상황에서 time-out에서 ACK이 안 왔으므로 데이터를 다시 보냄

Lost acknowldgment는 제대로 처리되지 않으면 deadlock이 발생할 수 있다.
  • rwnd = 0을 받게 되면 persistence timer(영속 타이머)가 시작되고 timer가 끝나도 rwnd = k라는 ACK이 오지 않는다면 sender는 probe 패킷(1바이트 크기 데이터)를 보내서 체크한다.
  • 아래의 경우는 deadlock이 발생하는 경우를 보여준다. → rwnd = k라는 ACK이 손실된 상황

deadlock이 발생한 예시(작년에 나옴)

 

9. Congestion Control

  • TCP의 Congestion Control는 open loop 및 closed loop 메커니즘을 모두 기반으로 함
  • TCP는 Congestion을 방지하고 Congestion이 발생한 후 congestion을 감지하고 완화하는 congestion window와 congestion policy을 사용한다.

1) Congestion

  • Congestion : 네트워크 상에 패킷들이 너무 많아서 혼잡이 발생하는 경우
  • buffer가 꽉 차게 되면 라우터가 패킷을 버림(packet loss) → packet loss의 원인 99%가 라우터가 버려서
rwnd : 수신 측이 보내준 윈도우 크기(Byte 단위)
cwnd : 네트워크 상황을 고려해서 정한 윈도우 크기 → 송신측에서 나온 윈도우 크기(실제로는 Byte단위지만 패킷단위로 아래에서 생각하기) → 무조건 0보다 큰 값을 가짐
<실제 윈도우 크기>
Window size = minimum(rwnd, cwnd)

(1) Packet delay and network load

  • Delay : receiver가 받는데 걸리는 시간(파일 하나 받는데 걸리는 시간)
  • Capacity : 네트워크의 용량
  • Load : 한 네트워크에서 전송되는 패킷의 수

→ Load가 Capacity 근처로 가면 기하 급수적으로 Delay가 증가한다.

→ 이후 어느 시점부터는 데이터가 전송이 안가는 상황이 발생하고 이 상황을 congestion이라고 함

(2) Throughput versus network load

  • Throughput(처리량) : 성능(정상적으로 전송되는 데이터의 양)
    ≠ receiving rate : 순간적인 속

트래픽이 늘어나면 점점 많은 데이터가 전송이 되는데 어느 시점을 넘어가서 congestion이 발생하면 제대로 전송되는 게 없고 처리량이 점점 내려감
congestion이 발생하면 packet loss가 생겨서 데이터를 다시 보내야 함   시간이 증가

2) Congestion Control

(1) Slow start, exponential increase

  • slow start algorithm : 송신 측이 window size를 1부터 packet loss가 일어날 때까지 기하급수적으로 증가
    • 초기 window size : 1 MSS
    • 매 RTT마다 window size2배로 키움(ex. 1, 2, 4, 8, 16 ...)
    • 패킷 손실을 감지하면 window size를 1MSS로 줄임
  • Threshold( = thresh) : 여기까지만 Slow start를 사용하겠다라는 의미를 가짐

(2) Congestion avoidance, additive increase

  • congestion avoidance algorithm : congestion이 감지될 때까지 congestion window의 크기가 추가적으로 증가
    • 송신 측이 transmission rate(window size)를 패킷 손실이 일어날 때까지 증가시키는 식의 접근법
  • additive increase : 송신 측의 window size를 손실을 감지할때까지 매 RTT마다 1 MSS씩 증가시킨다.

(3) Multiplicative Decrease

  • Multiplicative Decrease : 손실을 감지했다면 송신 측의 window size를 절반으로 감소
    → 혼잡이 발생하면 세그먼트 재전송 X, RTO 타이머 만료 또는 3개의 중복 ACK이 수신되는 등의 경우 발생

(4) TCP Congestion policy summary

(5) Congestion example

  • 혼잡이 심할 경우 하나 이후에도 packet loss가 더 생길 수 있다.
Window size는 패킷에서 16비트 차지 → 65536(2^16) Byte까지 표현 가능

<아래 그림 설명>

0 ~ 4 RTT : SS방식으로 cwnd가 2배씩 증가

4 RTT : Threshold를 만나게 되어 AI 방식으로 변경

4 ~ 8 RTT : AI방식으로 가다가 Time-out(혼잡)이 발생

8 RTT : time-out이 발생했기 때문에 cwnd는 1부터 시작되고 Threshold는 절반 값이 된다.

8 ~ 12 RTT : SS방식으로 cwnd가 2배씩 증가

12 RTT : SS방식이지만 Threshold를 초과하지 못하고 cwnd는 10이 된다.

12 ~ 14 RTT :AI방식으로 가다가 3 ACKs(packet loss → 혼잡)이 발생

14 RTT : 3 ACKs이 발생했기 때문에 cwnd는 MD가 적용되어 절반 값에서 시작

14 ~ RTT : AI방식으로 cwnd 계속 증가

Threshold는 time-out에 의해서만 바뀐다.

3) Why is TCP fair?

(1) RTT가 같은 두 세션 간의 경쟁

  • Additive increase는 throughput 증가와 마찬가지로 기울기가 1이다.
  • multiplicative decrease는 throughput을 비례적으로 감소시킴

<그래프를 통해 알 수 있는 점>

RTT가 같은 경우, 각 Connection들의 처리량이 시간이 지날수록 같아짐 → TCP Fair

 

(2) RTT가 다른 두 세션 간의 경쟁

  • RTT가 다르면 TCP not fair → RTT가 작을수록 처리량 증가율이 더 큼

4) Wifi Channels