근본 문제다
컴퓨터 네트워크를 배운지는 1년이 훌쩍 넘었지만 기억해내야 한다
TCP
- 연결지향적: 데이터 전송 전 송신자와 수신자 간의 연결 설정
- 신뢰성 보장: 데이터가 손실되거나 순서가 어긋나면 재전송
- 패킷의 순서를 보장하며, 모든 데이터가 정확히 도착하도록 확인
- 네트워크 상태를 고려해 데이터 전송 속도 조정
- 데이터 신뢰성 보장 때문에 헤더가 크고, 추가적인 처리 과정이 있음
- 예시: 웹 브라우징(HTTP, HTTPS), 이메일(SMTP), 파일전송(FTP)
UDP
- 연결 없이 데이터 전송
- 데이터가 손실되거나 순서가 바뀌어도 이를 감지하거나 수정하지 않음
- 헤더 크기가 작고, 추가적인 확인 과정 없이 전송 속도가 빠름
- 예시: 실시간 스트리밍, 온라인 게임
TCP는 데이터를 순서대로 보장할 수 있는 이유가 뭘까?
- 시퀀스 번호
- TCP는 데이터를 작은 청크로 분할하고, 청크에 고유한 시퀀스 번호를 부여함
- 시퀀스 번호는 각 패킷의 첫 번째 바이트의 위치를 나타낸다
- 수신자는 시퀀스 번호를 기준으로 데이터를 올바르게 조립한다
- ACK Acknowledgment
- 수신자는 데이터를 받을 때마다 수신 확인 응답 ACK를 송신자에게 보낸다
- ACK에는 수신자가 다음으로 받을 것으로 기대하는 시퀀스 번호가 포함 됨
- 만약, 시퀀스 번호가 100에서 시작하고 데이터 길이가 50이라면 ACK 번호는 150이 됨<- 여기부터 보내달라
- 송신자는 ACK를 확인해 데이터가 성공적으로 전달되었는지 확인한다
- 재전송 Retransmission
- 만약 송신된 데이터가 손실되거나 순서가 어긋난 경우, 재전송 타이머가 만료되면 해당 패킷을 다시 보낸다
- 중복 ACK - 수신자가 특정 패킷이 누락되었음을 감지하면 동일한 ACK 번호를 반복해서 보낸다
- 송신자는 중복 ACK를 보고 누락된 패킷을 재전송한다
- 버퍼링 Buffering
- 수신자는 순서가 맞지 않는 패킷을 버퍼에 임시 저장한다
- 누락된 데이터가 도착하면 버퍼에 저장된 데이터를 재조합해 순서를 맞춘다
- 흐름 제어 Flow Control
- Window Size - TCP는 수신자가 처리 가능한 데이터 양(윈도우 크기)를 송신자에게 알려준다
- 송신자는 윈도우 크기를 초과하지 않도록 데이터를 전송해 패킷 손실을 줄이고 순서 문제를 방지한다
- 혼잡 제어 Congestion Control
- 네트워크가 혼잡한 상황에서는 패킷 손실이 발생할 가능성이 높아 순서가 어긋날 수 있다
- TCP는 혼잡 제어 알고리즘(Slow Start, Congestion, Avoidance)를 사용해 전송 속도를 조정하고 손실을 줄인다
- Slow Start
- TCP 연결이 처음 시작되거나, 혼잡이 발생한 후, 송신자는 네트워크 상태를 알지 못한다
- 초기에는 천천히 데이터를 전송해 네트워크 혼잡 수준을 탐색한다
- 초기값 설정 - Congestion Window - 송신자가 전송 가능한 데이터의 크기 설정
- 송신자는 매 Round Trip Time에서 ACK를 수신할 때마다 전송 가능 데이터 크기를 2배로 늘린다
- 임계값에 도달하면 Congestion Avoidance 상태로 전환된다
- Congestion Avoidance
- 네트워크 혼잡을 방지하기 위해 송신 속도를 조정, 점진적으로 데이터 전송 속도를 증가시킨다
- 매 RTT마다 1 MSS만큼만 증가시킨다
- 혼잡 발생(패킷 손실)이 감지되면 현재 전송 크기의 절반으로 줄이고 다시 Slow Start로 돌아간다
- 연결 설정과 종료
- TCP는 데이터를 송수신 하기 전에 3 way handshake를 통해 연결을 설정한다
- 3 way handshake
- SYN: 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN 보냄.
- SYN+ACK: 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보냄. 승인번호는 클라이언트 ISN+1
- ACK: 클라이언트는 서버의 ISN+1한 값인 승인번호를 담아 ACK 서버에 보냄
- 3 way handshake
- 이 과정에서 초기 시퀀스 번호 Initial Sequence Number가 협상된다
- 양측은 서로의 시퀀스 번호를 기반으로 데이터 전송을 관리한다
- TCP가 연결을 해제할 때 4 way handshake 발생
- 4 way handshake
- 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트 보냄. 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답 기다림
- 서버는 클라이언트로 ACK라는 승인 세그먼트 보냄. CLOSE_WAIT 상태에 들어감. 클라이언트가 세그먼트 받으면 FIN_WAIT_2 상태에 들어감
- 서버는 ACK 보내고 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트 보냄
- 클라이언트는 TIME_WAIT 상태가 되고 다시 서버 ACK를 보내서 서버는 CLOSED 상태가 됨. 이후 클라이언트는 어느 정도의 시간을 대기한 후 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결 해제 됨.
- 4 way handshake
- TCP는 데이터를 송수신 하기 전에 3 way handshake를 통해 연결을 설정한다
- 요약
- 송신자는 데이터 청크에 시퀀스 번호를 부여해 순서를 식별한다
- 수신자는 시퀀스 번호를 기반으로 데이터를 올바르게 조합
- 누락된 데이터가 있으면 ACK나 재전송 요청을 통해 복구
- 수신 측 버퍼와 송신 측 흐름 제어로 데이터 흐름을 조율
'개발자 강화 > CS 개념' 카테고리의 다른 글
디자인패턴 MVC MVP MVVM FLUX (0) | 2024.12.12 |
---|---|
프로세스, 스레드 / 동시성 제어 그리고 운영체제 레츠고 (1) | 2024.12.12 |
HTTP (0) | 2024.12.12 |