배경
- 인터넷의 중심에는 IP 와 TCP 가 존재함
- IP 는 호스트 = 호스트의 라우팅, 주소할당 기능 제공에 초점을 두고
- TCP 는 신뢰할 수 없는 채널 위에 신뢰성을 구축한 개념임
TCP 통신이란
- 네트워크 통신에서 신뢰적인 연결방식
- TCP 는 기본적으로 unreliable network 에서 reliable network 를 보장할 수 있도록 하는 프로토콜
TCP 데이터 전송의 과정
- sender가 application layer 가 socket 에 data를 씀
- transport layer: data 를 segment에 감쌈, 그리고 network laer에 넘겨줌
- TCP/IP 4 계층에서 receiving node 로 전송이 됨, 이때 sender 의 sender buffer에 data를 저장하고,
receiver 는 receive buffer 에 data를 저장함. - application 에서 준비가 되면 해당 buffer에 있는 것을 읽기 시작함
- flow control 핵심은 이 receiver buffer 가 넘치지 않게 하는 것.
- 따라서 receiver는 RWND(Receive Window) 의 남은 공간을 알려줌
Reliable network 를 보장하는 것의 4가지 문제점
- 손실
- packet 이 손실될 수 있는 문제
- 순서 바뀜
- packet의 순서가 바뀌는 문제
- Overload
- receiever 가 overload 되는 문제
- Congestion
- 네트워크가 혼잡한 문제
TCP
- 신뢰성 구축 방법
- 유실 데이터 재전송
- 전송 순서 확인
- 혼잡 제어 및 회피 데이터 무결성
- 스트림 특징
- 전송된 모든 (byte) 가 수신된 모든 바이트와 한 치의 오차 없이 동일해야함
- 클라이언트에서 전송한 바이트 순서대로 도착
- 브라우저의 웹 성능을 최적화 하는데에 어느정도 문제를 야기할 수 있음
3-Way 핸드셰이크
- 클라이언트와 서버가 데이터를 주고 받기전, 패킷의 시퀀스 번호, 연결과 관련된 여러 변수의 값을 상호 합의해야함.
- Sequence 번호는 보안상의 이유로 양쪽에서 무작위로 뽑음
- 핸드셰이크 과정
- SYN : 클라이언트가 무작위로 시퀀스 번호 x를 고르고 SYN 패킷을 보냄.
- SYN ACK: 서버가 시퀀스 번호 x를 1만큼 증가시키고, 무작위로 시퀀스 번호 y를 고름
- 클라이언트가 x와 y를 모두 1만큼 증가시킨 후 마지막에 ACK 패킷을 보냄으로써 핸드셰이크 과정을 종료함
- 이 과정 전에는 애플리케이션 데이터가 오고 갈 수 없음
- 새로 맺어지는 모든 커넥션은 데이터가 전송되기도 전에 왕복 레이턴시를 한번 겪게됨
- 대역폭의 크기는 소요되는 시간에 아무런 영향을 미치지 않음
- 새로운 TCP 커넥션을 맺는 것 보다 기존에 연결되어있는 TCP 커넥션을 재사용하는 것이 매우매우 중요함
4-Way 핸드셰이크
연결 성립 후, 모든 통신이 끝났다면 해제해야함
- 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보냄
- 서버는 FIN을 받고, 확인했다는 ACK 을 클라이언트에게 보냄 (이때 모든 데이터를 보내기 위해 CLOSE_WAIT 상태가 됨)
- 데이터를 모두 보냈다면, 연결이 종료되었다는 FIN 플래그를 클라이언트에게 보냄
- 클라이언트는 FIN을 받고, 확인했다는 ACK 을 서버에게 보냄 (아직 서버로 부터 받지 못한 데이터를 기다리기 위해 TIME_WAIT)
- 서버는 ACK 을 받은 이후 소켓닫음 (Closed)
- TIME_WAIT 시간이 지나면 클라이언트도 닫음 (Closed)
TCP Fast Open (TFO)
- 새로운 TCP 커넥션을 생성할 때마다 발생하는 레이턴시 문제를 최소화하기 위해 만들어진 매커니즘
- TFO는 SYN 패킷안에서 데이터 전송을 가능케 함으로써 HTTP 트랜잭션 네트워크 레이턴시 15%, 전체 페이지 로딩 시간 10% 까지 줄일 수 있음
- 특정 조건이 충족되어야만 사용할 수 있음
- SYNC 패킷 안 페이로드의 크기에 한계
- 암호화된 쿠키를 필요로 하기 때문에 반복적으로 커넥션을 맺을 때 활용
혼잡 제어 및 회피
- 혼잡 붕괴는 대역폭이 서로 다른 채널들로 구성된 네트워크에게 영향을 주는 현상.
- 게이트웨이가 갖가지 다른 대역폭을 가진 네트워크와 연결되었을때 자주 발생
- 위와 같은 문제를 해결하기 위해 양방향으로 데이터를 보내는 속도를 조절할 수 있는 여러가지 매커니즘이 TCP 에 도입됨
- 흐름 제어 (flow control)
- 혼잡 제어 (congestion control)
- 혼잡 회피 (congestion avoidance)
해결 방법
- AIMD(Additive Increase / Multiplicative Decrease)
- 처음에 패킷을 보내고 문제없이 도착하면 1씩 늘리는 방식
- 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷의 보내는 속도 절반으로 줄임
- 초기에 네트워크의 높은 대역폭을 사용하지 못함
- Slow Start
- AIMD 방식의 초기에 전송속도를 올리지 못하는 단점을 극복하기 위해 사용
- 패킷이 문제없이 도착하면 ACK 패킷마다 window_size를 1씩 늘려줌
- 한주기가 지나면 window_size가 2배로 됨
- 혼잡현상이 발생하면 cwnd를 1로 떨어뜨림
- 이전에 혼잡현상이 발생했던 window size의 절반까지는 지수처럼증가하고 이후부터는 1씩 증가
- Fast Retransmit (빠른 재전송)
- 송신측에서 순번이 중복된 패킷을 3개 받으면 재전송하게됨
- Fast Recovery (빠른 회복)
- 혼잡한 상태가 되면 window size 를 1로 줄이지 않고 반으로 줄이고 선형 증가 → 혼잡 상황을 한번 겪고 나면 AIMD방식으로 증가
흐름 제어 (Flow Control)
- 송신자가 수신자에게 처리할 수 있는 만큼의 데이터를 전송하는 매커니즘
- 양쪽의 TCP 커넥션이 각각 rwnd 를 통지하여 수신 데이터를 저장할 버퍼 공간의 크기를 서로에게 알려줌
- 모든 ACK 패킷은 양 끝단의 가장 최근 윈도크기 값을 담고 있음
- slow start
- sliding window
윈도 스케일링 (RFC 1323)
- 원래의 TCP 스펙에서는 리시브 윈도 사이즈 16비트를 할당
- 최대: 2^16 - 1
- 하지만 이 최대치가 최적의 성능을 내기 위해서는 종종 충분치 않음
- 특히 대역폭 지연 곱이 높은 네트워크에서 그럼 (bandwidth delay product) -
- RFC 1323에서 최대 리시브 윈도 크기를 원래의 2^16 - 1 바이트에서 최대 1기가 바이트까지 늘릴 수 있게함
- 이 옵션은 3-Way 핸드셰이크가 일어나는 도중에 교환되고 ACK 에 포함될 16비트 윈도 크기 필드값에서 왼쪽 시프트 연산을 해야할 비트 수를 나타냄
- 오늘날 TCP 윈도 스케일링 옵션은 대부분의 플랫폼에서 활성화 되어있지만, 다른 값으로 덮어쓰거나 제거해버릴수도있음
참고
'네트워크' 카테고리의 다른 글
[RFC-8705] - OAuth 2.0 Mutual-TLS (1) | 2024.02.12 |
---|---|
[네트워크 ] - HTTP 1.0, HTTP 1.1, HTTP 2.0 (0) | 2024.01.31 |
[네트워크] - IPv4 (0) | 2024.01.16 |
[네트워크] - 소켓과 포트 (0) | 2024.01.16 |