이 작동을 하는 TCP먼저 알아보자
TCP 프로토콜의 역할
- 신뢰할 수 없는 공용망에서 정보 유실이 없는 통신을 보장하기 위해 세션을 안전하게 연결
- 데이터 분할 기능
- 분할된 데이터 패킷이 잘 전송됐는지 확인하는 기능
- 패킷에 번호(Sequence Number)를 부여하고 잘 전송됐는지 응답(Acknowledge Number)한다.
- 수신자를 고려하여 전송 크기(Window Size)를 고려하여 통신
패킷 순서와 응답 번호
- TCP에서는 분할된 패킷을 잘 분할하고 수신 측이 잘 조합하도록 패킷에 순서를 주고 응답 번호를 부여
- 패킷에 순서를 부여하는 것을 시퀀스 번호
- 응답 번호를 부여하는 것을 ACK 번호
- 이 두 번호가 상호작용하여 중간에 순서가 바뀐것을 확인 가능
- 보내는 쪽에서 패킷에 번호를 부여하고 받는 쪽은 이 번호의 순서가 맞는지 확인
- 받은 패킷 번호가 맞으면 응답을 주는데 다음 번호의 패킷을 요청 (이 숫자를 ACK 번호라 부름)
- 송신 측이 1번 패킷을 보냈는데 수신 측이 이 패킷을 잘 받는다변 1번을 잘 받았으니 2번을 달라함
- 이 표시로 ACK 번호2를 보냄
양방향 통신
위 그림처럼 단방향이 아닌 양방향으로도 이뤄질 수 있다.
- 출발지에서 시퀀스 번호를 0으로 보냄(SEQ = 0)
- 수신측에서는 0번 패킷을 잘 받았다는 표시로 응답 번호(ACK)에 1을 적어 응답한다. 이때 수신측에서는 자신이 처음 보내는 패킷이므로 패킷에 시퀀스 번호 0을 부여한다. (SEQ = 0, ACK = 1)
- 이 패킷을 받은 송신 측은 시퀀스 번호를 1로(수신 측이 ACK 번호로 1번 패킷을 달라고 요청 했으므로), ACK 번호는 상대방의 0번 시퀀스를 잘 받았다는 의미로 시퀀스 번호를 1로 부여해 다시 송신
Window Size & Sliding Window
- TCP는 상대방이 얼마나 잘 받았는지 확인하기 위해 ACK 번호를 확인 후 다음 패킷 전송
- 패킷 전송이 잘됐는지 별도 패킷 받는 것이 통신 시간을 늘리지만 먼거리일 경우 왕복 지연시간(RTT)이 늘어나므로 훨씬 유리
- 따라서 데이터를 패킷에 보낼 때 한꺼번에 많이 보내고 응답은 한 번만 받음
- 이때 한 번에 데이터를 받을 수 있는 데이터 크기를 윈도 사이즈(Window Size)라고 함
- 네트워크 상황에 따라 윈도 사이즈를 조절하는 것이 슬라이딩 윈도(Sliding Window)라고 함
3 - HandShake (3방향 핸드셰이크)
- TCP에서는 안전한 통신을 위해 통신 시작 전 연결 작업을 진행
- 수신자가 준비가 안되면 데이터가 버려지기 때문
- 3번의 패킷을 주고받으면서 통신을 서로 준비하는 것을 뜻함
- 클라이언트에서 통신을 시도할 때 Syn 패킷을 보냄(SYN - SENT라고 부름)
- 클라이언트의 Syn을 받은 서버는 SYN-RECEIVE 상태로 변경되고 Syn, Ack로 응답
- 이 응답을 받은 클라이언트는 ESTABLISHED 상태로 변경하고 그에 대한 응답을 서버로 다시 보냄
- 서버에서도 이 응답을 받고 ESTABLISHED 상태로 변경
- 이 상태는 서로 연결이 성공적으로 완료 됐음을 의미
이렇게 여러 통신이 겹치면 기존 통신과 새로운 통신을 구분할 필요가 생긴다.
이를 구별하기 위해 플래그(Flag)라는 값을 넣어 통신
플래그(Flag) 종류
- SYN
- 연결 시작의 용도이며 시작될 때 SYN 플래그에 1로 표시하여 보냄
- ACK
- ACK 번호가 유효할 경우, 1로 표시
- 초기 SYN 외에 모든 패킷은 기존 메세지에 대한 응답이므로 ACK 플래그는 1
- FIN
- 연결 종료 시 1로 표시
- 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용
- URG
- 긴급 데이터인 경우, 1로 표시해 보냄
- PSH
- 서버 측에서 전송할 데이터가 없거나 버퍼링 없이 데이터를 응용 프로그램으로 즉시 전달할 것을 지시할 때 사용
16비트 출발지 포트 번호 | 16비트 도착지 포트 번호 | |||||||
32비트 시퀀스 번호 | ||||||||
32비트 ACK 번호 | ||||||||
4비트 헤더 길이 | 6비트 예약 | URG | ACK | PSH | RST | SYN | FIN | 16비트 윈도 사이즈 |
16비트 TCP 체크섬 | 16비트 긴급 포인터 | |||||||
옵션 | ||||||||
데이터 |
위는 TCP 헤더 내용
- 통신을 처음 시도하므로 송신자는 SYN필드를 1로 표기해 패킷에 전송
- 이때 자신이 사용할 첫 SEQ NO(시퀀스 번호)를 적어서 보냄
- 이 SYN 패킷을 받은 수신자는 SYN과 ACK 비트를 플래그에 1로 표기해 응답
- 자신이 보내는 첫 패킷이므로 SYN을 1로 표기
- 기존 송신자가 보냈던 패킷의 응답이기도 하므로 ACK 비트도 함께 1로 표기
- 이때 자신이 사용할 SEQ(시퀀스 번호)를 적고 ACK번호는 송신자가 보낸 시퀀스 번호(SEQ=10)에 1을 추가한 값(ACK=11)을 넣어 응답
- 이 ACK 번호는 10번까지 잘 받았으니 다음에는 10+1번을 달라는 의미
- 이때부터는 기존 메시지의 응답이므로 ACK 필드만 1로 표기됨
- 수신자가 ACK 번호를 20으로 표기해 보냈기 때문에 시퀀스 번호를 21로 표기해 응답
- 동시에 수신자의 시퀀스 번호 20에 대한 응답이므로 ACK 번호를 21로 보냄
- 이 ACK 번호는 20번을 잘 받았으니 다음 시퀀스 번호를 보내달라
- 동시에 수신자의 시퀀스 번호 20에 대한 응답이므로 ACK 번호를 21로 보냄
'Network > Network Composition' 카테고리의 다른 글
ARP란? (0) | 2022.12.23 |
---|---|
허브, 스위치, 라우터, 로드밸런서란? (0) | 2022.12.20 |
유니캐스트, 멀티캐스트, 브로드캐스트, 애니캐스 (0) | 2022.12.20 |
DWDM이란? (0) | 2022.12.20 |
잘 알려진 상위 프로토콜 지시자 (이더 타입) (0) | 2022.10.14 |