Position of transport layer

- 혼잡이 발생하면 end system(4계층)에서 제어 ⇒ TCP가 함
22.1 Process to Precess Delivery
- Socket의 구성
- Client의 IP
- Server의 IP
- Server의 Port
- Protocol
- 이 5가지 중 하나라도 다르면 다른 소켓임
- Client의 Port
- Port 번호는 0 ~ 65535(216−1)
- 이미 바인딩된 Port는 다른 process와 바인딩 불가능

- IP header(3계층)의 IP 주소와 Transport layer header (4계층)의 Port 번호를 통해 어느 프로세스와 통신할지 결정
IANA Internet Assigned Numbers Authority
: 전 세계 인터넷에서 사용하는 번호 체계(숫자 자원)를 공식적으로 관리하는 조직
- Port 번호 (0 ~ 65535) 관리
- 공통적으로 사용되는 포트를 미리 약속해서 결정해줌
| 구분 | 범위 | 설명 |
|---|
| Well-known Port | 0 ~ 1023 | 전 세계적으로 표준화된 서비스 포트(IANA가 엄격히 관리) |
| Registered Port | 1024 ~ 49151 | 일반적인 응용 프로그램, 상용 소프트웨어가 등록하여 사용 |
| Dynamic/Private Port | 49152 ~ 65535 | 클라이언트가 임의로 사용하는 포트 (자동 할당) |
포트 번호의 충돌 문제
- 모든 프로세스는 (IP, Port) 쌍으로 소켓을 식별
- 같은 컴퓨터에서 동일한 IP + 동일한 포트 번호를 두 개 이상의 프로세스가 동시에 사용할 수 없음 ex)
- 서버 A와 서버 B가 둘 다 8080 포트를 사용하려 하면,
- 클라이언트가 두 서버에 동시에 연결할 수 없음 (포트 충돌 발생)
- 서로 다른 Process가 같은 Port와 바인딩될 수 없기 때문에 한 프로세스는 문제가 발생함
→ 즉, 서버는 반드시 고유한 포트 번호를 사용해야 함
- 클라이언트는 그냥 Dynamic range에서 아무거나 할당 받으면 됨
포트 번호 충돌을 방지하기 위해 Registered Port가 존재하는 것
- 미리 IANA에 신청해서 포트를 등록
- 다만 이 포트는 독점권을 주는 것이 아니라, 단순한 충돌 방지용 등록
Socket Address
인터페이스에 맞춰서 꽂기만 하면 Socket
- BSD OS
- 버클리 대학에서 만든 운영체제
- Socket Library를 탑재 ⇒ 많은 사람들이 이 라이브러리를 사용하여 네트워크 프로그래밍
- C언어 기반
- 객체지향 언어 등 다른 소켓 프로그래밍 라이어브리도 많이 등장
Connectionless vs Connection-oriented service
- Transport Layer는 Connectionless일수도 있고, Connection-oriented일 수도 있음
- TCP는 Connection-oriented UDP는 Connectionless
Connectionless
- 연결 없음
- 패킷 순서 보장 X
- 패킷 손실 가능
- Ack 없음 (잘 받았다는 신호 없음, 그냥 냅다 패킷 보내면 끝)
- 지연될 수 있음
- 과거 멀티미디어에서 UDP로 많이 사용
- UDP 위에 직접 프로그래밍 해서 TCP처럼 동작하게 할 수도 있음
Connection-oriented
- 연결 먼저 하고 통신, 통신 끝나면 연결 끊음
- 파일 전송은 파일 데이터가 깨지면 안 되기 때문에 TCP로 전송
Connection Establishment

| 단계 | 방향 | 설명 | SYN | ACK | FIN |
|---|
| 1 | A → B | A가 연결 요청 (SYN 전송) | 1 | 0 | 0 |
| 2 | B → A | A의 SYN에 대한 응답 + B도 요청 | 1 | 1 | 0 |
| 3 | A → B | B의 SYN에 대한 응답 (ACK 전송) | 0 | 1 | 0 |
Connection Termination

| 단계 | 방향 | 설명 | SYN | ACK | FIN |
|---|
| 1 | A → B | A가 종료 요청 (FIN 전송) | 0 | 0 | 1 |
| 2 | B → A | A의 FIN에 대한 ACK 전송 | 0 | 1 | 0 |
| 3 | B → A | B도 종료 요청 (FIN 전송) | 0 | 0 | 1 |
| 4 | A → B | B의 FIN에 대한 ACK 전송 | 0 | 1 | 0 |
- 연결 끊기는 Host A, Host B 각각 끊어줘야 함
Error control
22.2 UDP
- connectionless - 연결 없음
- unreliable protocol
- 데이터 깨지는지 안 깨지는지 체크 안 함
- flow control 없음
- error control 없음
- 필요 시 응용 프로그램이 직접 처리해야 함

NFS (Network File System)
- UDP로 구현됨 왜?
- LAN 환경에서는 전송 오류나 혼잡 발생이 거의 없기 때문에 TCP 안 써도 패킷 오류가 거의 없기 때문
- 옛날에는 하드디스크 용량이 부족했음
- 한 WorkStation(컴퓨터)에서 작업하다가 용량이 다 차면 다른 Workstation으로 옮겨서 작업했는데 호환성 문제가 발생
- NFS가 프로토콜을 통해 Data를 마운트 해줌 ⇒ 유저는 로컬에서 Data에 접근하는 것처럼 동작
장점
- 서로 다른 파일 시스템에 있는 것들을 하나의 가상의 폴더에 있는 것처럼 만들어줌
단점
- 과거의 멀티미디어 응용은 거의 UDP를 사용했으나 최근에는 TCP도 많이 사용함
왜?
- 사용자가 고품질 재생을 원하기 때문
- 네트워크 대역폭과 품질이 대폭 향상됐기 때문
버퍼링
: 재생 지연을 방지하기 위해 데이터를 일정량 먼저 받아 두는 것
- 클라이언트 버퍼링을 이용하면 패킷 소실에 대한 재전송 시간이 있음

22.3 TCP
- 순서 보장 O
- Reliable Transmission
연속된 byte 단위 (Stream of Bytes)를 받는 것처럼 동작
- 중간에 순서가 바뀌면 receiver가 재조정
- 중간에 data가 손실되면 재전송 해줌
→ TCP의 Sequence number을 통해 실현됨
Sending and Receiving Buffers

TCP segment

- 각 TCP Segment(Packet)의 사이즈는 동일하지 않아도 됨
Sequence number
: Segement의 첫 번째 byte의 위치를 나타냄
- Data Stream에 대한 위치를 이 Sequence number로 표현
- 각 Header 안에 Sequence number가 있음
- 32bit - 모두 1이 되면 다시 0부터 시작하기 때문에 계속 data 전송 가능
- 시작 number는 랜덤
다음 sequence number = 이전 segment의 sequnce number와 전송 크기를 더한 것
예제 1
TCP가 6000byte 데이터를 전송하고, 첫 번째 byte의 sequence number가 10010인 경우,
1000 byte를 전송하는 4개의 segments와 2000byte를 전송하는 마지막 segment의 sequence number는?
정답
- sequence 01: 10010
- sequence 02: 11010
- sequence 03: 12010
- sequence 04: 13010
- sequence 05: 14010
예제 2
예제 1에서 TCP가 7000byte 데이터를 전송하고, sequence가 6번까지 있다면?
정답
- sequence 01: 10010
- sequence 02: 11010
- sequence 03: 12010
- sequence 04: 13010
- sequence 05: 14010
- sequence 06: 16010
⇒ 14010 + 2000: sequence 05 number + sequence 05가 전송한 data의 크기

flag field
- ACK: Ack 보냄
- SYN: Sequence number 동기화
- FIN: 연결 종료
- flag field에서 flag가 1인 필드만 의미 있는 필드
ACK

- Host A가 Seq 42를 보내면, Host B는 Seq 43을 받을 차례니까 ACK 43을 보냄
- Host A가 ACK 79를 보내면, Host B는 79를 보낼 차례니까 Seq 79를 보냄
- 즉, Seq는 전송한 Data 번호, ACK는 받은 Data의 다음 번호 (받아야 할 Data 번호)
Flow Control
: Receiver의 buffer가 넘치지 않도록 Sender가 데이터 전송 속도를 조절하는 통신 기법
방법
Sliding Window Protocol을 통해 구현됨


- Window Size
- Sender 입장: ACK를 안 받고 data를 보낼 수 있는 크기
- Receiver 입장: 내가 지금 받을 수 있는 양
-
Receiver가 Window size를 계속 알려줌
-
Sender가 Window size만큼만 데이터를 전송
-
ACK과 함께 윈도우 크기를 갱신하면서 흐름 제어 수행
ex) ACK 203을 받으면 Sender buffer에서 이미 보낸 202 201 200은 밀어버리고 이 3칸만큼의 공간을 확보
- 창문을 미는 것처럼! 그래서 window sliding!
Sliding windows
- window size를 다 채워서 보낼 필요 없음
- window size는 receiver에 의해 결정 및 조절 가능
- Sender의 window size ≤ Receiver의 window size
- ACK 바로 안 보내도 됨
Error control
- Checksum을 통해
- 깨진 데이터 확인
- Sequence number을 통해
- lost segments 검출
- 순서가 바뀐 segment 검출
- 중복된 segments 검출
Lost Segment
문제
- 패킷을 보냈는데 이전 Packet에 대한 ACK가 오는 경우 → 해당 Segment가 전달이 안 된 것
해결
- Sender: 해당 패킷에 대한 ACK가 올 때까지 패킷을 재전송
Lost Acknoledgment
문제
- 패킷을 보냈는데 해당 패킷에 대한 ACK가 안 오는 경우 (Segment time out)
해결
- Sender: ACK를 못 받았으니까 data를 못 받은 것으로 간주하고 다시 패킷을 재전송
- Receiver: Sequence number을 확인 해서 이미 받았던 건 버림
TCP Timers
RTT (Round trip time)

RTT=α(previousRTT)+(1−α)(currentRTT)
- α: 신뢰도
- 과거 data를 기반으로 현재 data의 평균을 예측함 ⇒ 평균 값이 일정
- Exponential averaging 기법
- 지수평균: 최근 측정값에 더 많은 가중치를 주고, 과거 값은 점점 덜 반영하는 방식의 평균 계산
Retransmission time
RTO=2∗RTT
⭐ flow control과 congestion control의 차이
📌 Flow Control
receiver의 buffer가 넘치지 않도록 제어하는 것
제어 방법
- TCP의 Sliding window Protocol을 통해서 flow를 제어함
- receiver의 window size 크기에 맞춰 데이터를 전송함
- sender’s window size ≤ receiver’s window size
Sliding window Protocol
: 수신자가 알려준 수신 가능 범위(window size) 내에서만 송신자가 데이터를 전송
- 수신자가 ACK을 보내면서 윈도우 크기를 조정함
📌 Congestion Control 혼잡 제어
router의 buffer가 넘치지 않도록 제어하는 것
- Burst: 데이터가 순식간에 많이 들어와서 Rate가 확 튀는 것
단계
- 먼저 혼잡을 인식 (네트워크 용량이 초과될 때)
- 네트워크 처리 용량 한계 이하로 낮춤
- 라우터 버퍼는 Bursty한 (일시적으로 많은 양이 들어오는) 데이터를 처리
- 즉, 일시적이며 혼잡을 완전히 해결하지 못 함
혼잡 인식
- loss event를 통해 혼잡을 인식
- timeout : timer가 expire할 때까지 ACK가 안 오면 loss event 발생
- 3 duplicate acks : 3개의 중복된 ACK가 오면 loss event 발생
제어 방법
-
AIMD
혼잡 발생 시 Rate를 1로, 혹은 최소 절반 이하로 떨어트림
- Additive Increase: 혼잡이 없으면 전송률을 선형적으로 조금씩 증가
- Multiplicative Decrease: 혼잡이 감지되면 전송률을 절반 이하로 급격히 감소
-
Slow Start
Rate의 시작점을 낮춤
‼️ 주의 ‼️
- Rate를 천천히 증가시키는 것 ❌
- Rate는 exponential하게 (지수적으로) 증가함
-
Conservative after timeout events
패킷 손실로 Timeout이 발생했을 경우, 가장 보수적으로 전송률을 낮춤