TCP
1. point-to-point
- 한쌍의 process 간의 통신만 관장
- socket 1쌍 사이의 데이터 통신만 책임짐
2. reliable, in-order byte stream
- 신뢰성이 보장되므로 데이터 유실 x
- 데이터가 순서대로 전송
3. pipelined
- 한번에 window 크기만큼 여러개 packet 보냄
4. full duplex data
- 데이터가 양방향으로 전송
- server, client가 sender이면서 receiver
5. send&receiver buffers
- sender의 window buffer: 재전송하기 위해 packet 저장
- receiver buffer: 순서가 바뀐 채로 들어오는packet 저장
- 모두가 sender이면서 receiver이기 때문에 각자 2개의 buffer 필요
5. flow controlled
- receiver가 받을 수 있는 양만큼만 전송
6. congestion control
TCP segment structure

- application layer의 전송 단위=message
- TCP의 전송 단위=segment
- Network layer의 전송 단위=packet
- Link layer의 전송 단위=frame

- 32bit
- 각 포트 16bit
- 포트 번호 이론적으로 0~216−1
- source port
- 보내는 사람의 socket에 해당하는 identifier
- destination port
- sequence number
- acknowledgement number
- checksum
- recevice window
- receiver buffer에 얼마나 빈공간이 있는지 알려줌
TCP sequence numbers and ACKs

Sequence number
- 세그먼트 데이터 제일 앞에 있는 byte number
ACK
- cumulative ACK
- ACK 10 : 9번까지 다 받았으니 10번 달라
Host A -> Host B
- sender의 data=C, byte number=42
- ACK=79 (78번까지 잘 받았으니 79번 보내달라고 요청)
Host B -> Host A
- ACK= 42+1 (42번까지 잘 받았으니 43번 보내달라고 요청)
- seq=79
- 42: A에서 내려오는 message byte 번호
= A의 send buffer의 sequence number
= B의 receive buffer에서 관리하는 index 번호 (ACK)
- 79: B에서 내려오는 message byte 번호
= B의 send buffer의 sequence number
= A의 receive buffer에서 관리하는 index 번호 (ACK)
Timeout -- function of RTT
Timeout value를 무엇으로 할 것인가?
- 작게하면 복구는 빠른 대신 오버헤드 늘어남
- RTT: 어떤 segment가 목적지에 갔다가 돌아올 때까지 걸리는 시간
- timeout=RTT
- segment마다 RTT 값은 모두 다름
1) segment의 경로가 다 다르기 때문
2) 경로가 같더라도 queueing delay가 다름

- RTT 측정할 때마다 편차 매우 큼
-> 중구난방
-> 대표할만한 RTT 값을 생성해야함

- EstimatedRTT: 보정한 RTT값
- SampleRTT: 측정한 값을 그대로 사용하면 편차가 너무 큼
- 하지만, EstimatedRTT<SampleRTT인 경우 확실하지 않은 상태에서도 timeout으로 처리할 수 있음

TCP reliable data transfer
- pipeline 방식
- cumulative ACK 사용
- timer 하나만 사용
- go-back-N과 비슷
- 그러나, go-back-N과 달리, timeout 발생하면 해당 segment만 재전송

1. ACK가 유실되는 경우
- A sender buffer의 92~99번 해당하는 segment전송
- B receiver buffer 92~99번 받아서 올리고 ACK100 보내 100번 기다림
- A의 timer 만료되며 재전송
- B가 다시 ACK100 보냄
2. ACK 전송 도중 Timeout 발생한 경우
- A가 92~99, 100~119번 보냄
- B는 잘 받아 ACK100, ACK120 보냄
- timer 만료되어 A가 다시 92~99번을 보냄
- B의 receiver는 120번을 기다리는데 92~99번이 와서 버리고 ACK120 다시 보냄

3. 첫번째 ACK가 유실
- A가 92~99, 100~119번 보냄
- B는 ACK100, ACK120 보냈지만 ACK100이 유실되고 ACK120 받음
- ACK100은 유실되었지만 ACK120은 119번까지 잘 받았다는 뜻이므로 buffer clear
Data 받을때마다 ACK 해야 하는가?
- 권고사항: delayed ACK
- 기다렸다가 ACK
- 마지막 ACK만 받으면 상관 없기 때문
- 여러개 받는 것보다 마지막 ACK 받는게 간편
Fast retransmit
- timeout 긴시간동안 기다림
- timeout 전 packet 유실 여부 알 수 있음
- 중복 ACK 번호를 3번(총 4번) 받으면 유실로 판단
-> timer 터지기 전 미리 재전송