Stop-And-Wait 방식

- 패킷이 손실된 경우를 대비하여, ACK이 올 때까지 버퍼에 data를 유지한다.
- reliable하지만, 효율이 떨어진다.
Window
- 데이터를 효율적으로 주고받기 위해서, TCP에서는 window를 설정한다.
- 이전에 보낸 패킷에 대한 ACK이 오기 전까지, 보낼 수 있는 패킷 개수를 window size로 설정한다.
- 즉, 현재 수용 가능한 패킷의 개수가 window size이다.

- TCP 헤더에 Window Size에 대한 공간이 존재한다.
Flow Control
- 초기 연결을 할 때, ACK의 rwnd정보를 기반으로 초기 swnd를 설정한다.
- 연결설정 후, 데이터를 주고받으며 window size를 효율적으로 업데이트한다.
- 수신측 데이터처리가 송신측 데이터전송보다 느린 경우, 데이터 송신 속도가 느려지도록 한다.
- 수신측 데이터처리가 송신측 데이터전송보다 빠른 경우, 데이터 송신 속도가 빨라지게 한다.
-> 효율적으로 처리할 수 있도록 한다.
Silly Window Syndrom
- 데이터를 느린 속도로 받아오거나 보낼 때 발생한다.
- 원인이 두 경우로 나뉜다.
By Sender
- 보내려는 데이터 크기가 많이 작은 경우 발생한다.
- 송신측에서 1byte, 2byte... 작은 크기의 데이터를 보내기 위해 20byte이상의 헤더를 붙여서 데이터를 보내게 된다. 이는 비효율적이라고 할 수 있다.

이는 Nagle's Algorithm을 이용하여 해결할 수 있다. MSS의 크기만큼 데이터가 모이기 전까지, 혹은 ACK이 도착하기 전까지는 데이터를 보내지 않고 모아놓는다. 그러면 큰 크기의 데이터를 모아서 보낼 수 있다.
하지만 데이터를 바로바로 보내야 하는 real-time-application에는 적합하지 않다.
By Receiver
- 수신측에서 데이터를 느리게 읽어갈 때 발생한다.
이는 Clark's solution을 이용하여 해결할 수 있다. MSS만큼 버퍼의 크기가 확보될 때까지, 혹은 버퍼에서 절반만큼 비워질 때까지 rwnd를 0으로 보내서, 수신측에서 데이터를 더 보내지 않도록 한다.
Delayed Acknowledgement를 사용할 수도 있다. 수신측의 버퍼에 충분한 공간이 생길 때까지 ACK을 보내지 않는 방법이다. 송신측에서는 ACK을 받기 전까지 swnd가 갱신되지 않기 때문에, 데이터를 보내지 못한다.
SYN Flooding
- TCP의 특성을 이용해 네트워크를 공격하는 방법이다.
https://velog.io/@cnc4750/SYN-Flooding-정리
Error Control
- TCP는 reliable한 process-to-process 통신을 보장하는 transport layer의 프로토콜이다.
- TCP에서 Error Control을 위해 checksum, acknowledgement, time-out을 사용한다.

Acknowledgement Rule 1(Normal Operation)
- ACK을 보내야 하는 일반적 상황에서, ACK의 개수를 최소화시키기
- piggybacking -> ACK을 보내기 전에 sending buffer를 확인하고, 보낼 데이터가 있으면 ACK과 같이 보낸다.
Acknowledgement Rule 2(Normal Operation)
- rule1에 의해 ACK을 보내기 전에 sending buffer를 확인했을 때, 보낼 데이터가 없으면 일정시간 기다린다.
- 시간이 지나도 sending buffer가 비어있다면, 그 때는 ACK만 보낸다.
Acknowledgement Rule 3(Normal Operation)
- 적어도 2개의 segment에 대해서는 하나의 ACK을 보내야 한다
-> 2개의 segment에 대한 신뢰성 보장

Acknowledgement Rule 4(Lost Segment)
- 손실된 패킷이 있는 것을 확인한 경우, ACK을 보내 이를 알린다.
- RTO 안에 ACK이 오지 않는 경우, 손실됐다고 판단하고 재전송한다.
Acknowledgement Rule 5(Lost Segment)
- 손실되었던 패킷을 다시 받았을 때, 바로 ACK을 보낸다.
Acknowledgement Rule 6(Lost Segment)

- 중복된 패킷을 받았을 때, 바로 ACK을 보내 이를 알린다.
Fast Retransmission

- 같은 ACK을 3개 연속으로 받을 경우, time out을 기다리지 않고 즉시 재전송한다.