TCP Service
- error control, flow control, congestion control 다 가능
- connection oriented방식
TCP의 well-known port
Stream delivery
- TCP는 초기 연결 후, stream(연속된 byte) 형태로 data를 전송한다.
Sending and Receiving buffers
- 분홍: sent, ACK X / 회색: Not sent
- 버퍼: process가 전달한 data를 전송하기 전, 임시 보관 장소
- 보통 1byte 단위로 동작
TCP segments
- TCP packet = TCP segment
- TCP는 buffer에 있는 data로 Segment를 만들어 전송
- segment의 크기는 TCP 내부 protocol로 인해 정해짐 (0~65535)
- SYN message를 통해 최초 sequence number 공유
TCP의 sequence number
- 각 연결에서 전송되는 segments는 TCP에 의해 sequence number가 정해진다.
- TCP가 임으로 최초의 sequence number를 지정
ex)
- 5000byte data를 전송
- first byte numbe is 10,001
- each segment can carry 1,000bytes
- sequence number는 해당 segment에 포함된 첫번 째 data byte의 number임
- TCP의 ACK는 누적 ACK
- ACK 11,001은 11,000번까지 잘 받았다는 의미
Segment
- piggybacking 사용가능(ACK + data)
HLEN: Header length
- 4bit로 표현 하기 때문에 HLEN값 * 4를 해줘야 실제 header length가 나온다th가 나온다 (IP와 동일)
Window size: TCP는 window size가 가변적이라 지정 필요
- Receiver가 지정 (Receiver window size = ex)4 임을 segment에 담아 전송)(RWND)
- Network 혼잡 시 window size를 줄여서 통신
- flow control, congestion control
Urgent pointer: ufg에서 급히 처리해야 하는 data의 위치 정보
- 100이면 여기부터 100byte 뒤에 urgent data가 있다는 의미
Control field
ufg: 급히 처리해야 하는 data (기준이 모호(OS끼리 충돌)하여 현재는 사용하지 않음)
ACK: 이 segment는 Acknowledgement를 포함한다.
PSH: buffer가 차지 않았어도 그냥 상위계층에 전송해라.
- 보통 TCP는 효율을 위해 buffer가 일정 수준 이상 차면 전송한다.
RST: 연결을 끊자. (오류가 있거나 등)
SYN: 연결을 시작하자.
- SYN message를 통해 최초의 sequence number 공유
FIN: 연결을 끊자. (통신 완료 시)
Checksum
- UDP와 마찬가지로 전달 오류 방지를 위해 Pseudo header를 checksum에 포함한다.
- TCP는 UDP와 다르게 Checksum이 필수적이다(Mandatory)
Encapsulation
payload: 실제 전달하고자하는 정보 (header, metadata 제외)
TCP Connection
- TCP는 Connection-oriented이다.
- Source와 Destination에 가상의 path를 설정함(segment들이 이 path로 이동)
- TCP는 가상의 conttection(path)를 생성하지만 실제로는 IP(Connectionless)를 통해 전달 된다.
- IP에서 error로 packet이 손실 되더라도 TCP가 재전송 요청을 함
three-way handshake (Connection Establishment)
Active open: 능동적 접근
Passive open: 수동적 접근
- SYN segment는 data를 포함하지 않지만 sequence number를 소비한다.
- 가상의 1byte가 있다고 취급
- 따라서 ACK 8001
- SYN + ACK segment도 data를 포함하지 않지만 sequence number를 소비한다.
- 가상의 1byte가 있다고 취급
- 따라서 ACK 15001
- rwnd(window size) 포함
- ACK segment는 자체는 가상의 byte가 있다고 취급하지 않고 sequence number를 소비하지 않음.
- 따라서 seq가 그대로 8000
- rwnd(window size) 포함
- 보내준 receive window size에 맞게 send window size를 조정한다.
Data transfer
- three-way handshake 이후의 data transfer과정
- Connection Termination과 Connection Establishment의 위치가 바뀜
- sequence number의 흐름 이해 필요
- Data에 따른 sequence number 변화
- 마지막은 ACK만 있기 때문에 sequence number 변화 없음
Three-way handshake(Connection Termination)
- FIN segment도 SYN segment와 마찬가지로 sequence number를 소비함
- 양 방향 동시에 연결 종료
Half-close (Four-way handshake)
- 한 쪽 연결 먼저 종료 후, 다른 쪽 연결 종료
- 한 쪽에서는 더이상 보낼 data가 없고 다른 쪽은 있을 때
ex) 통계 서버인 경우, 통계를 내는 시간 동안 한 쪽은 연결을 유지하고 있을 필요가 없음
- Connection이 종료되어도 ACK는 보낼 수 있음 (Data는 전달 불가)
- Client 측은 Connection을 먼저 종료하였기 때문에 sequence number가 x로 유지
State Trantion diagram
Time-Wait
- Client가 FIN에 대한 ACK를 수신 한 후, TIME-WAIT 상태로 가는 이유
- packet이 지연된 경우, Client가 이전 Connection의 packet을 다음 Connection의 packet으로 착각 할 수 있음
- packet이 유실된 경우, ACK를 받지 못해 Server 측의 연결이 계속 연결 될 수 있음
Half-close일 떄, server와 client의 states
-
-
- server와 client의 states를 각각 다른 방식으로 보여준다.
three-way handshake 일 때, server와 client의 states
Siultaneous
open
- 양 쪽의 연결이 동시에 이루어 지는 방식
- Client와 server간이 아니라 PC와 PC간의 연결에 사용
close
Denying a Connection
- 연결을 강제 종료할 때
- error 등의 이유로 connection 거부(RST 전송)
- Connection이 되어 있는 상태에서도 문제가 있다면 언제든 RST 전송 가능
- 이전에 받은 packet에 대한 ACK.
- 이전에 받은 packet에 ACK가 필요 없다면 안 보내도 됨.
State 정리
TCP Window
send window
receive window
- TCP는 receive window size에 따라 window size가 가변적이다.
- TCP에는 TCP 내부 buffer가 있음(size가 다름)
- window size는 buffer size보다 항상 작아야 함
- 왼쪽 벽이 움직이는 것(오른쪽으로)을 closes, 오른쪽 벽이 움직이는 것(오른쪽으로)을 opens
- Go-Back-N이나 Selective reqeat는 오른쪽 벽과 왼쪽 벽이 함께 움직였지만 TCP는 따로 움직이며 Window size를 조정한다.
- 왼쪽 벽은 ACK를 받았을 때 Closes
- 오른쪽 벽은 수신 측에서 보낸 rwnd가 늘어났을 때 Opens
- Shrinks(축소)는 수신 측에서 보낸 rwnd가 더 작을 때 일어남
- 실제로는 더 복잡해지기 때문에 잘 사용하지 않음
- window가 Shrinks 되는 과정에서 아직 ACK를 받지 못한 Byte가 Window 밖에 있는 경우가 생길 수 있음
Flow Control
push: 강제로 밀어 넣기
pull: 준비되면 빼가기
Flow Control Ex
- rwnd로 window size 조정으로 flow control 가능
Shrinking of Windows 공식
new ackNo + new rwnd >= last ackNo + last rwnd
ex) 210 + 4 (220) <= 206 + 12 (218) (성립 X)
- 이 공식에 어긋나면 window가 shrink됨
- shrink되면 ACK를 받지 못한 214가 window 밖으로 나가게 됨
Error Control
- TCP는 reliable protocol
- TCP에서 error control은
checksum
Acknowledgment
time-out
을 통해 이뤄짐
checksum
- checksum을 확인 후 오류가 있으면 packet을 버림
Acknowledgment
- TCP는 Go-Back-N + Selective repeat
- Go-Back-N의
누적 응답
- Selective repeat의
keep out of order packet
sender FSM
receiver FSM
Generating Acknowledgments Rules (효율적인 방법)
Rule 1: ACK는 piggybacking으로 보낸다.
Rule 2: Segment가 한개 왔을 떄, timer(500ms)가 만료되면 ACK를 보낸다.
Rule 3: ACK를 보내지 않은 Segment가 2개 오면 즉시 ACK를 보냄
Rule 4: 도착한 Segment가 순서에 어긋난 경우 그 즉시 받아야할 Segment정보가 담긴 ACK를 보낸다.
Rule 5: 이전에 누락된 Segment를 받으면 즉시 다음에 받아야할 Segment정보가 담긴 ACK를 보낸다.
fast retransmission: 동일한 ACK가 3번 연속 오면 Timer 상관 없이 바로 재전송
- ACK가 중간에 유실되어도 error control 가능
Deadlock
ex)
해결법
Timer
Retransmission: 재전송 타이머
- 일정 시간 ACK가 오지 않으면 Segment 재전송
Persistence: 지속 타이머
- 송신측에서 Persistence timer 시간 마다 rwnd size를 물어봄.
- Deadlock 방지를 위해 존재
Keepalive:
- TCP session이 살아 있는지 서로 확인하기 위해 사용
TIME-WAIT:
- TCP 연결을 끊을 때 충분한 시간을 두고 끊음
Silly Window Syndrome
- 송신측 : 송신자가 1byte씩 전송할 때 (비효율적)
- 수신측 : 수신측 process가 1byte씩 가져갈 때 (비효율적)
- 1byte씩 가져갈 때마다 rwnd 조정됨
- 수신 window가 꽉찬 상태 였다면 송신측도 1byte씩 보낼 수 밖에 없음
해결법
송신측
Nagle's Algorithm
1. process에서 처음 내려온 1byte는 바로 전송
2. 이후에 내려온 packet은 maximum segment size까지 모았다가 전송
3. 수신 측에서 ACK가 오면 maximum segment size가 아니더라도 바로 전송
4. ACK가 오지 않아도 maximum segment size가 되면 전송
수신측
Clark's Soulution
1. 수신측 process가 1byte를 가져가 rwnd 여유공간이 1byte생기더라도 송신측에 rwnd = 0으로 전송
2. maximum segment size를 수용할 수 있을 만큼 충분한 공간이 생긴 경우 rwnd를 풀어줌
3. 전체 buffer의 반 이상이 비어 있는 경우 rwnd를 풀어줌
Delayed Acknowledgment
1. ACK를 바로 보내지 않고 buffer에 충분한 공간이 생기면 ACK를 지연해서 보냄
Congestion control
- Network 혼잡 제어
- router는 network가 혼잡해지면 packet을 버리기도 함
Slow start mode
Congestion avoidance mode
- sender가 congestion을 인지하는 법
-
Time-out으로 인한 재전송
-
3개의 중복 ACK 도착(fast retransmission)으로 인한 재전송
- Congestion 감지시, Congestion Detection Mode로 진입
- Time-out은 ACK가 오지도 않았기 때문에 3ACK보다 심각한 상황임
MD: 1/2로 감소
Time-out으로 인한 Congestion(더 심각)
- Congestion Detection Mode 진입
- Congestion이 감지된 시점을 기준으로 threshold를 반으로 줄여 SlowStart(1부터)
- threshold에 도달 하면 다시 Congestion avoidance mode 진입
3ACK로 인한 Congestion
- Congestion Detection Mode 진입
- Congestion이 감지된 시점을 기준으로 cwnd를 반으로 줄여 Additive Increase