TCP의 특징
TCP는 아래와 같은 특징을 가지고 있습니다.
1. TCP: Transmission Control Protocol의 약자입니다.
2. Layer 4 protocol
3. Controls the transmission
4. Connection
5. Require handshake
6. 20bytes headers Segment (can go to 60)
7. Stateful
TCP의 Use case
1. Reliable Communication (e.g. chat 기능)
2. Remote shell
3. Database connections
4. Web communications
5. Any bidirectional communications.
TCP Connection
- Connection은 Layer 5입니다. (Session)
- Connection은 Client와 Server 사이의 합의라고 볼 수 있습니다.
- 데이터를 보내기 위해서는 Connection을 만들어야합니다.
- Connection은 4가지 속성으로 정의됩니다.
- Source IP - Source Port
- Destination IP - Destination Port
- Conection 밖으로는 데이터를 보낼 수 없습니다.
- 종종 Socket 혹은 file descriptor로 불립니다.
- 3-way TCP handshake가 필요합니다.
- Segments는 연속적이고 순서가 있습니다.
- Segments는 Acknowledged 되어야 합니다.
- Lost Segments는 재전송됩니다.
TCP Connection Establishment (3-way handshake)
App1 (10.0.0.1)이 AppX (10.0.0.2) 에 데이터를 보내고 싶다고 가정합니다.
1. App1이 SYN 메세지를 AppX에 전달합니다.
2. AppX가 SYN/ACK을 되돌려줍니다.
3. App1이 ACK을 보냅니다.
왓츠앱은 300만 tcp connection을 서버에 연결할 수있다고합니다.
TCP Sending Data
1. App1이 데이터는 segment에 포함시키고 보냅니다.
2. AppX가 Segment를 Acknowledge 합니다.
그러면 여러개의 Segment를 보내면 순서가 어떻게 되는걸까요?
TCP Acknowledgement
여러 개의 데이터(seq1, seq2, seq3)를 받고 난 후 마지막에만 ACK을 보내도 괜찮습니다.
TCP Lost data
3번 데이터를 잃는 경우
받는 서버는 ACK2까지만 보내고
보내는 서버가 다시 요청을 보내서 (Seq3) 다시 ACK3을 보냅니다.
TCP Closing Connection (4-way handshake)
1. App1이 FIN을 보내고
2. AppX가 ACK을 보냅니다.
3. AppX가 FIN을 보내고
4. App1이 ACK을 보냅니다.
TCP Connection State
TCP는 Stateful Protocol 입니다.
따라서, Client와 Server는 State를 유지 하고 있습니다.
아래와 같은 상태들을 유지합니다.
왼쪽이 Client, 오른쪽이 Server 입니다.
Established state 이후에 client가 FIN을 보낸 순간부터 각 state가 정의되어 있습니다.
TCP Fast Open (TFO)
리눅스 커널 3.13 부터는 TFO라는 것이 기본적으로 enable 되어있습니다.
TCP 연결 자체가 3-way handshake로 이루어 진 이후에 실제 데이터를 보내는데 이 조차도 개선이 가능합니다.
Client가 TFO cookie를 포함해서 SYN 그리고 데이터를 보내면 됩니다.
아래와 같이 말이죠.
다만, 최초 연결부터 TFO 사용이 가능하지는 않습니다.
첫번째 Connection시에 TFO 쿠키 값을 서버가 Client에게 전달을 해아합니다.
아래와 같이 말이죠.
실제 쿠키 사용 과정을 정리해보면 아래와 같습니다.
실제 쿠키 사용 과정
- 클라이언트는 첫 연결 시 3-way 핸드셰이크를 통해 서버로부터 TFO 쿠키를 전달받습니다.
- 이후 재접속할 때 클라이언트는 이 쿠키를 TCP SYN 패킷에 첨부해 서버로 보냅니다.
- 서버는 이 쿠키를 복호화하여 클라이언트를 확인하고, 핸드셰이크 과정에서 데이터를 미리 전송하는 것을 허용합니다.
TFO 쿠키의 특성
- 길이: TFO 쿠키는 최대 16바이트의 고정된 길이를 가집니다.
- 서버에서 발급: TFO 쿠키는 서버가 클라이언트에 처음 연결할 때 발급되며, 서버는 이 쿠키를 암호화된 형태로 생성합니다.
- 암호화 및 무결성: 쿠키는 서버 측에서 클라이언트의 IP 주소나 기타 연결 관련 정보를 암호화하여 생성합니다. 쿠키의 무결성을 보장하기 위해 서버는 대칭 암호화 알고리즘이나 메시지 인증 코드(MAC)를 사용할 수 있습니다.
- 쿠키 갱신: 클라이언트는 동일한 서버에 여러 번 접속할 때 동일한 쿠키를 사용할 수 있으며, 서버는 주기적으로 이 쿠키를 갱신할 수 있습니다.
예시: TFO 쿠키 구조
TFO 쿠키의 형식은 매우 단순할 수 있으며, 보안 요구 사항에 따라 다양한 구성 요소를 포함할 수 있습니다. 예시로 쿠키가 포함할 수 있는 필드를 보면 다음과 같습니다:
- 쿠키 버전 (1 byte): 쿠키의 버전을 나타내며, 프로토콜이 업데이트될 경우에 사용됩니다.
- 서버 생성 시간 (4 bytes): 쿠키가 서버에서 언제 생성되었는지 나타냅니다. 이를 통해 서버는 오래된 쿠키를 무효화할 수 있습니다.
- 암호화된 정보 (11 bytes): 서버는 클라이언트의 IP 주소나 기타 식별 정보를 암호화하여 저장합니다. 이는 서버가 클라이언트를 신뢰할 수 있는지 확인하는 데 사용됩니다.
간단한 TFO 쿠키 값의 예시입니다.
0x01 0x5F3759DF 0x9BFF4B5A 0xD47C8A23E3F847C8
- 0x01: 쿠키 버전 (1바이트)
- 0x5F3759DF: 쿠키 생성 시간 (4바이트, UNIX 타임스탬프)
- 0x9BFF4B5A: 암호화된 클라이언트의 IP 주소 (또는 기타 식별 정보)
- 0xD47C8A23E3F847C8: 암호화된 MAC 값 (11바이트)
'CS 지식 > 네트워크 기본 다지기' 카테고리의 다른 글
UDP와 DNS (1) | 2024.09.30 |
---|---|
TLS 1.2, 1.3 (4) | 2024.09.30 |
Layer 4 vs Layer 7 Load balancing (0) | 2024.09.29 |
TCP Flow Control & Congestion Control (4) | 2024.09.23 |
TCP Segment 구조 (0) | 2024.09.23 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.