- 세그먼트 전달
네트워크 계층에서 전송 계층으로 세그먼트를 전달합니다. 이 세그먼트는 패킷 단위로 전달되며, 전송 계층에서 이를 처리하여 메시지를 복원합니다. - 메시지 저장 (버퍼)
전송 계층은 수신자의 소켓 버퍼에 복원된 메시지를 저장합니다. 이 버퍼는 메시지가 응용 계층으로 전달되기 전 임시로 저장되는 공간입니다. - 응용 계층으로 메시지 전달
수신자의 응용 프로세스가 소켓을 통해 메시지를 읽어갑니다.- 소켓은 응용 프로그램과 네트워크 계층 간의 인터페이스 역할을 합니다.
- 응용 계층 프로세스는 소켓을 사용하여 필요한 데이터를 가져옵니다.
- 버퍼에서 메시지 제거
메시지가 응용 프로세스에 의해 읽혀지면 소켓 버퍼에서 해당 메시지는 제거됩니다.- 이는 버퍼 공간을 효율적으로 사용하고 새로운 데이터를 받을 수 있도록 하기 위함입니다.
Flow control
버퍼는 유한한 크기의 공간일거고 어느순간 버퍼가 꽉 차는 경우가 발생할 것입니다. 그러다보면 하위계층에서 수신된 데이터가 버퍼에 저장되지 못하니 전송계층에서 버려지는 loss가 발생하게 됩니다.
따라서 flow control은 결국 수신자측에서 보면 네트워크 하위 계층에서 수신되는 속도, application process에서 읽어가는 속도를 적절하게 조절하는 것입니다.
수신자가 전송자를 제어하는 것으로 즉, 수신자의 버퍼가 오버플로우가 발생하지 않도록 전송자를 조절하는데 너무 빠르게 하지 않도록 제어하는 것이 flow control이라고 합니다.
TCP는 수신 윈도우(Receive Window)를 사용하여 송신자가 전송하는 데이터의 양을 조절합니다. 수신자는 TCP 세그먼트 헤더의 수신 윈도우 필드를 통해 자신이 처리할 수 있는 데이터의 크기(버퍼 여유 공간)를 송신자에게 알립니다. 송신자는 이 값을 참고하여 데이터 전송량을 조정하고, 수신자의 버퍼가 초과되지 않도록 합니다. 이 과정을 통해 TCP는 흐름 제어를 수행하며, 네트워크 혼잡을 방지하고 안정적인 데이터 전송을 보장합니다.
Receive Window (RcvWindow)
- 역할: TCP 수신 측에서 사용할 수 있는 버퍼 공간(남은 공간)을 나타냅니다. 이 값은 송신 측에 "얼마나 데이터를 보낼 수 있는지"를 알려줍니다.
- RcvBuffer: 수신 버퍼의 총 크기(일반적으로 4096바이트로 기본 설정됨).
- LastByteRcvd: 수신 측에서 가장 마지막으로 받은 바이트.
- LastByteRead: 수신 측에서 애플리케이션에 의해 읽혀진 마지막 바이트.
2. TCP 데이터 흐름
- 작동 과정:
- 송신 측은 수신 측의 RcvWindow 값을 기반으로 데이터를 전송합니다.
- 수신 측의 버퍼에 남아있는 공간이 줄어들면, RcvWindow 값도 줄어들어 송신 측이 데이터 전송 속도를 조절하도록 합니다.
- 이를 통해 수신 버퍼가 오버플로우(데이터 초과)되는 것을 방지합니다.
3. Receive Buffer
- 역할: 수신된 데이터가 임시로 저장되는 공간입니다.
- 특징:
- 소켓 옵션을 통해 크기를 조정할 수 있습니다.
- 일부 운영체제는 RcvBuffer 크기를 자동으로 조정합니다.
4. 송신 측의 동작
- 송신 측은 수신 측의 Receive Window 값을 확인하여 unacked data(확인되지 않은 데이터)의 양을 제한합니다.
- 이는 송신 측이 한 번에 전송할 수 있는 데이터의 양을 제어하여 네트워크 안정성을 유지하도록 돕습니다.
TCP Connection management
연결 지향형이기에 handshake 과정을 겪어야합니다.
통신에 필요한 파라미터를 설정하게 됩니다. 대표적인 파라미터들은 seq number와 버퍼의 크기, flow control 정보를 핸드 셰이킹 과정에 포함하고 있습니다.
TCP에서는 핸드셰이킹 과정은 두 개체가 결국 3개의 메세지를 주고받기 때문에 Three way handshaking을 겪습니다.
Client가 서버에서 TCP SYN segment를 서버로 전달
- 이는 segment 헤더의 syn 플래그 비트를 1로 설정합니다. specifies initial seq, no data입니다.
서버가 클라이언트로부터 syn segment 수신, SYNACK segment 응답
- 서버는 서버측의 버퍼를 할당
- segment 헤드의 비트 1 설정
- 서버측의 초기 seq number를 설정
클라이언트가 SYNACK을 수신, ACK segment 응답
- syn 비트는 0으로 설정 (핸드셰이킹 끝남)
- 클라이언트 버퍼 크기 할당
TCP Connection Management
SYNbit = 1, Seq = x
서버는 마찬가지로 서버측의 초기 sequence number를 설정하고 클라이언트에게 synack segment를 응답합니다. SYNBIT = 1, Seq = y, ACKbit = 1, ACKnum = x + 1로 세팅이 됩니다.
마지막으로 client가 그것에 대한 ACK를 보내면서 핸드셰이킹 과정이 종료가 됩니다.
connection closing
데이터를 주고받는 것이 끝났을 때 하는 것입니다.
segment 헤더의 FIN bit = 1을 이용해서 close 시킵니다.
- 클라이언트가 먼저 FIN bit=1 설정한 seg=x를 전송합니다. (데이터 전송 가능)
- 클라이언트 측에서 데이터 전송을 하지 않을 것을 알려주는 작업입니다.
- 서버는 그것에 대해서 ACKbit=1, ACKnum=x+1 을 보냅니다 (데이터 전송 가능)
- 서버가 closing 할 때 까지 대기합니다.
- 서버측에서 FINbit=1, seq=y를 전송하면서 closing을 시작합니다 (데이터 전송 불가)
- client가 거기에 대해서 ACKbit=1, ACKnum=y+1을 보내면 connection이 closing이 발생합니다.
'IT 프로그래밍 > 컴퓨터네트워크' 카테고리의 다른 글
[컴퓨터네트워크] 네트워크 계층 (1) | 2024.12.04 |
---|---|
[컴퓨터네트워크] Congestion control (1) | 2024.12.04 |
[컴퓨터네트워크] TCP - (1) | 2024.12.03 |
[컴퓨터네트워크] 파이프라인 (0) | 2024.12.03 |
[컴퓨터네트워크] 신뢰성 (1) | 2024.12.03 |