→ Open in Slid
Connection-oriented demux
- TCP의 경우 연결을 맺는데 사용되는 Door Socket이 있고 커넥션 별로 소켓이 따로 있다.
- 따라서 한 프로세스가 커넥션 마다 소켓 하나씩을 가지므로 여러개의 소켓을 가질 수 있다.(각 클라이언트를 응대하기 위해)
따라서 demux를 위해선 목적지 프로세스와, 출발지 프로세스에 대한 정보가 필요하다.
- 목적지 프로세스 구분을 위해 : 목적지 IP, 포트번호
- 출발지 프로세스 구분을 위해 : 출발지 IP, 포트번호
- 따라서 TCP는 총 네개의 정보가 필요하다.
UDP : User Datagram Protocol
- UDP 프로토콜의 특징
- 연결을 맺지 않는, Connection Less Protocol이다.
- 신뢰성이 낮고 (Unreliable), 순서를 맞춰서 전송해주지 않는다 (Unordered)
- 체크섬 기능으로 오류가 발생했는지 안했는지만 알려준다.
- 거의 기능이 없는 가장 기본적인 프로토콜이다.
- 왜 사용할까?
- Best Effort : Congestion Control 없이 일단 보낸다.
- Pure (No frils)하다.
- 그러므로 전송 오버헤드가 없다.
- 어디에 사용할까?
- 스트리밍 : Data Integrity보단 처리량이 중요하므로 Best Effort로 전송하는 UDP를 사용한다. 이론적으론 그렇지만 실제로는 TCP를 많이 사용한다.
- DNS : 일회성 질의이므로 굳이 커넥션을 맺을 필요가 없다.
- SNMP : SNMP는 네트워크 관리 프로토콜이다. 정기적으로 최신정보를 업데이트하므로 Data Integrity가 중요하지 않다.
- 신뢰성이 매우 중요한 경우 : 신뢰성이 매우 중요한 경우에는 reliability를 애플리케이션 계층에서 확인하므로 TCP가 필요없다.
- Http 3.0은 TCP 오버헤드를 줄이기 위해 UDP를 사용한다. //3/28(일)까지 수강한 내용
신뢰성있는 데이터 전송의 원리
신뢰성 있는(Reliable) 데이터 전송을 위해선 다음과 같은 기능이 필요하다.
- Checksum : 체크섬 비트를 둬서 데이터에 오류가 있는지 검사하는 방법(신뢰성 보장 1)
- Ack : Acknowledge, 잘 받았다는 확인 응답(신뢰성 보장 2)
- N-Ack : Negative Acknowledge, 잘못 받았다는 확인 응답, 웹에서는 사용하지 않는다.
- Timer : Ack(or N-ack) 를 무한정 기다릴 수 없으므로 타이머를 둔다.(신뢰성 보장 3)
- Window Pipelining : 데이터 전송과 수신을 비동기식으로 처리하기 위한 Window다. 쉽게 얘기하자면 데이터를 주고-받고-주고-받고가 아니라 주고 주고 주고 받고 주고 받고 받고 식으로 통신한다는 것이다.
- Sequence Number : 순서에 맞는 데이터 전송을 위한 순서 정보다. 포트를 재사용할 수 있으므로 통신 시작 시 랜덤한 Sequence 동기화하는 과정을 거친다. (SYN 플래그를 사용한다.)(신뢰성 보장 4)
TCP
TCP는 메세지를 임시 저장소인 버퍼에 담아서 Flow Control, Congestion Control에 의해 제어되는 속도로 버퍼에 있는 메세지를 전송한다.
- 버퍼 담는다는 것에 주목해보자.
- TCP는 잠시 버퍼에 담았다가 전송한다.
- 버퍼로 인해 메모리에 부담이 커질 수 있다.
- 잠시 담았다가 전송하므로 Throughput 성능이 떨어진다.
- Flow Control이란?
- 수신측에도 TCP 버퍼가 있다.
- 수신 측 TCP 버퍼가 가득 차도록 송신 측에서 빨리 전송하면 어떻게 될까?
- 메시지는 기껏 거의 다 와서 유실된다.
- 커넥션을 맺을 때 / 서로 통신할 때 자신의 남은 버퍼 크기를 전송해서
- 그 크기만큼 보내지 않도록 조정한다.
- Congestion Control이란?
- 라우터에도 버퍼가 있다.
- 라우터 버퍼가 가득 차면 메시지가 유실되어 수신 측에서 ACK가 오지 않을 것이다.
- ACK가 오지 않으면 중간 라우터에서 데이터 Loss가 생긴 것 (== Congestion 발생)으로 인식하고
- 데이터 보내는 속도를 줄인다.
TCP의 특징과 원리
- 제공하는 기능들
- Point to Point (일대일) 연결이다.
- Reliable, In-Order bytestream이다.
- Pipelined(신뢰성을 보장해준다) 되어있다.
- Full Duplex (동시 양방향 통신)이다.
- Connection Oriented 통신(handshaking필요)이다.
- Flow, Congestion Control을 제공한다.
TCP Segment

TCP segment 구조는 위에 보이는 것과 같이 고정(fixed)파트, 가변(variable)파트 두 개로 나뉜다.
출처 : https://www.slideserve.com/redford/the-tcp-segment-header
- TCP 세그먼트의 헤더는 기본 4바이트 5줄(20byte=고정헤더길이) + Options(가변헤더길이=알 수 없다)으로 구성되어있다.
- 따라서 TCP 세그먼트의 크기는 20byte + a 이다.
- Src 포트와 Dest포트만 있다. IP 주소는 네트워크 계층 헤더에 있다.
- Sequence Number : TCP는 Inorder 전송을 위해 데이터에 순서 번호를 붙여서 전송한다.
- Acknowledgement Number : ACK == 100이면 99까지 데이터를 받았고 100번 데이터를 전송해달라는 것이다. TCP는 누적 ACK를 사용한다. (상대방이 나한테 보낸 데이터에 대한!)
- TCP Header Length : Optional 필드가 있으므로 어디까지가 헤더인지 알아야 한다.
- TCP Control FlagsURG
- URG : 급한 데이터가 있음을 나타낸다. Urgent Pointer에 값이 있음을 의미.
- ACK : 1로 세팅되면 ACK에 값이 유효함을 의미한다.
- PSH : PUSH, 버퍼링 된 데이터를 상위 계층으로 즉시 전송할 것을 의미한다.
- RST : 연결 리셋 시 사용되는 플래그이다.
- SYN : 연결 시작 시 송수신 번호 동기화를 위해 사용된다.
- FIN : 연결 종료를 나타내는 플래그이다.
- Window Size : ACK를 받지 않아도 전송 가능한 세그먼트의 양이다. Congestion Control을 위한 CWND와 Flow Control를 위한 RWND 중 작은 값을 선택한다.
- CWND : Congestion Window. rwnd를 무시할 때 송신 측이 Ack 없이 한 번에 데이터를 보낼 수 있는 크기이다. 작은 값에서 시작해서 점점 늘려나가다 네트워크 상에서 Loss가 일어나면, 즉 중간의 라우터에서 Congestion이 발생해 패킷이 유실되면 CWND를 줄인다.
- RWND : Receiving Window, 수신 측 TCP 버퍼 여유공간의 크기이다. 여유공간의 크기 이상으로 ACK 없이 데이터를 전송하면 수신 측 버퍼가 가득 찰 수 있으므로 Window는 RWND 보다 작아야 한다.
TCP Time-out
- 어느 정도 시간이 흐른 뒤에도 ACK가 오지 않으면 Loss가 발생했다고 판단할 수 있을까?
- Time-out 시간이 너무 짧으면 불필요한 재전송이 많을 것이고 너무 길면 Loss가 일어나도 재전송까지 시간이 오래 걸릴 것이다.
- Time-out시간은 RTT를 이용해서 판단한다.
- 일정 시간 동안의 RTT 값의 가중평균에 Safety Margin을 더해서 Time-out Interval을 정한다.(일반적으로 DevRTT의 4배를 safetyMargin으로 정한다.)
- Time-out Interval \= EstimatedRTT + 4*DevRTT(=safety margin)
- 일반적으로 a = 0.125, b = 0.25를 사용한다.
- 최근 추정 값의 오차가 커지면 Interval의 값이 커진다.
- Interval은 RTT값이 크게 변해도 가중 평균되기 때문에 완만한 그래프를 그린다.
- Time-out Interval (RTO)를 측정하는 방법은 여러 가지가 있다.