너무너무 멋져 눈이눈이 부셔
네트워크 TCP와 UDP 본문
TCP
패킷사이 순서 보장. 연결지향 프로토콜을 사용해서 신뢰성을 구축해서 수신여부 확인.
'가상회선 패킷 교환 방식'사용 : 각 패킷에는 가상회선 식별자가 포함되며 모든 패킷을 전송하면 가상 회선이 해제되고 패킷들은 전송된 순서대로 도착.
(얘들끼리 통로가 만들어지고 나서야 서로 통신이 가능하다.)
→마치 전화같은거 내가 하는 말을 B한테 바로 전달 가능. 중간에 비는 데이터가 없음.(패키지 손실이 없다.)
- 연결형 프로토콜
송신자와 수신자 사이의 논리적인 연결을 확립하고 데이터를 전송하는 방법으로 패킷들의 순서가 맞지 않을 위험이 적고 오류 발생 시 재전송을 하여 신뢰성 있는 전송이라고 할 수 있다.
TCP 통신 단계와 세그먼트 구조
통신 단계는 크게
1. 연결 수립
2. 데이터 송수신(재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어)
3. 연결 종료
MSS(Maximum Segment Size) : TCP로 전송할 수 있는 최대 페이로드 크기.
연결 수립과 종료
TCP 상태
TCP는 연결형 통신, 신뢰할 수 있는 통신을 유지하기 위해 다양한 상태를 유지한다.
상태란 어떤 통신 과정에 있는지를 나타내는 정보. (그래서 TCP는 스테이트풀 프로토콜이라고도 한다)
- 연결이 수립되지 않은 상태
- 연결 수립 상태
- 연결 종료 과정의 상태
로 나눌 수 있다.
연결 수립이 되지 않은 상태
- CLOSED : 아무런연결이 없음
- LISTEN : 연결 대기 상태.
세그먼트 정보
- 송신지 포트, 수신지 포트
- 순서 번호 : 세그먼트의 올바른 송수신 순서 보장. 세그먼트 데이터의 첫 바이트에 부여되는 번호.
- 확인 응답 번호 : 상대 호스트가 보낸 세그먼트에 대한 응답. 다음으로 수신하기를 기대하는 순서 번호 명시
- 제어 비트 : 세그먼트 부가 정보
- 윈도우 : 수신 윈도우(한 번에 수신하고자 하는 데이터 양) 크기 명시
제어 비트
- ACK : 세그먼트 승인 표현
- SYN : 연결 수립를 위한 비트
- FIN : 연결 종료를 위한 비트
순서 번호와 확인 응답 번호
- 초기 순서 번호(ISN)
처음 통신을 위해 연결을 수립할 때, SYN 플래그가 1로 설정된 세그먼트는 순서 번호를 무작위 값을 넣는다.
- 이후 순서 번호는 초기 순서 번호 + 송신한 바이트 수 (초기 번호가 100이고 세그먼트가 각 500바이트라면 다음 세그먼트의 순서 번호는 600이다)
- 확인 응답 번호 : 다음으로 받기를 기대하는 순서 번호. '다음에는 순서번호 nnnn 보내 주세요'라는 의미로, ACK 플래그를 1로 설정. 초기 순서 번호 + 1이다.
쓰리 웨이 핸드셰이크 (연결 수립)
3단계의 연결 수립 과정
방향 | 세그먼트 | 정보 | 비유 |
A->B | SYN 세그먼트 | - 호스트 A의 초기 순서 번호 - 1로 설정된 SYN 비트 |
연결 시작 |
B->A | SYN+ ACK | - 호스트 B의 초기 순서 번호 - 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 SYN 비트 -1로 설정된 ACK 비트 |
확인했습니다. |
A->B | ACK 세그먼트 | - 호스트 A의 다음 순서 번호 - 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 ACK 비트 |
네, 확인햇씁니다. |
- 액티브 오픈 : 처음 연결을 시작하는 호스트의 연결 수립 과정(위의 예시에서는 A->B 의 첫 동작)
-패시브 오픈 : 연결 요청을 받고 나서 요청에 따라 연결을 수립하는 과정(위에서는 B의 동작)
TCP 상태
- LISTEN : 일반적으로 서버로 동작하는 패시브 오픈 호스트는 이 상태를 유지.
액티브 오픈 호스트의 SYN 세그먼트를 기다리는 상태.
즉, 액티브 오픈 호스트가 LISTEN 상태의 호스트에게 세그먼트를 보내면, 쓰리 웨이 핸드셰이크가 시작
- SYN-SENT : 액티브 오픈 호스트가 SYN세그먼트를 보낸 뒤, 응답인 SYN+ACK 세그먼트를 기다리는 상태. (연결 요청 후 대기상태)
- SYN-RECEIVED : 패시브 오픈 호스트가 SYN+ACK 세그먼트를 보내고, ACK를 기다리는 상태
- ESTABLISHED: 연결이 확립. 데이터를 송수신 가능한 상태. 마지막 ACK를 주고 받은 후.
포 웨이 핸드셰이크(연결 종료)
방향 | 세그먼트 | 정보 | 비유 |
A_B | FIN | 1로 설정된 FIN | A :연결 끊을게요 |
B->A | ACK | - 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 ACK 비트 |
B :확인했습니다 |
B->A | FIN | 1로 설정된 FIN | B :연결 끊을게요 |
A->B | ACK | - 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 -1로 설정된 ACK 비트 |
A; 확인헀습니다 |
- 액티브 클로즈 : 먼저 연결을 종료하려는 ㅡ호스트에 의해 수행
- 패시브 클로즈 : 연결 종료 요청을 받아들이는 호스트에 의해 수행.
TCP 상태
- FIN-WAIT-1 : 종료 첫단계. 연결 종료 요청을 보낸 액티브 클로즈 호스트
- CLOSE-WAIT : FIN 세그먼트를 받은 패시브 클로즈 호스트가 응답으로 ACK를 보낸 후 대기하는 상태
- FIN-WAIT-2 : FIN-WAIT-1에서 ACK 세그먼트를 받은 상태. 상대의 FIN을 기다림
- LAST-ACK : CLOSE-WAIT상태에서 FIN을 전송하고, ACK를 기다리는 상태
- TIME-WAIT : 액티브 클로즈 호스트가 FIN세그먼트를 수신하고, ACK 세그먼트를 전송한 후의 상태.
왜 TIME-WAIT가 필요한가?
상대 호스트가 받았어야 할 마지막 ACK 세그먼트가 올바르게 전송되지 않았을 수 있으므로. + 연결 종료 후 다른 연결을 수립하는 과정 사이에 대기 시간이 없다면, 서로 다른 연결의 패킷이 혼란을 야기할 수 있음.
UDP
식수대로 물 마시기
비연결형 통신을 수행하는, 신뢰할 수 없는 프로토콜이다.
TCP처럼 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어를 수행 X, 상태 유지도 하지 않음(스테이트리스 프로토콜)
- 데이터그램 패킷 교환 방식이다.
- 순서 보장, 수신 여부 확인 X
- 단순 데이터만 전송한다. 패킷이 독립적으로 이동하며 최적의 경로를 선택한다.
- 비연결형 프로토콜
연결을 확립하지 않고 데이터를 전송하는 방법.
- 송수신지 포트
- 길이: 헤더 포함, UDP 데이터그램의 바이트
- 체크섬 : 데이터 전송 과정에서 오류가 발생했는지 검사. 문제가 있으면 폐기. (수신지까지 잘 도달했는지를 나타내는 신뢰성과는 관련 없음)
둘의 비교
TCP
- 패킷 손실이 없다.(신뢰성)
UDP
- 오버헤드가 적어서 빠르다.
- 단, 패킷 손실이 일어날 수 있다(그래서 실시간성이 중요한 스트리밍 등에 사용)
Q. TCP와 UDP를 비교하세요
TCP와 UDP는 전송 계층의 프로토콜입니다. 먼저, TCP는 신뢰성을 가진, 연결형 프로토콜입니다. 가상 회선 패킷 교환 방식을 사용하여, 연결이 수립되어야 송수신이 가능합니다. 상태를 유지하는 특성이 있어 스테이트풀 프로토콜의 일종이라고도 합니다. 패킷이 수신지까지 올바른 순서대로 전달되는 것을 보장하기 위해, 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공합니다. UDP는 TCP보다 신뢰성은 떨어지지만 보다 빠른 통신이 가능합니다. UDP는 TCP와 다르게 연결을 수립하고, 해제하거나 앞서 말한 제어 기능을 수행하지 않습니다. 마치 패킷을 수신지에 마구 던지는 것 처럼 정보를 전달하기 때문에, 패킷이 손실되거나 순서를 보장할 수 없다는 특징이 있습니다. 또한, 상태를 유지하지 않아 스테이트리스 프로토콜의 일종이라고도 합니다.
Q. 쓰리웨이 핸드셰이크 과정을 설명하세요.
TCP의 3-웨이 핸드셰이크 과정은 클라이언트와 서버가 통신을 하기 전에 연결을 수립하는 과정을 말합니다. 이 과정은 3단계로 진행됩니다.
먼저, 클라이언트가 서버에 연결 요청을 위해 SYN 세그먼트를 보냅니다. 이 패킷에는 클라이언트의 초기 순서 번호가 포함됩니다.
두번째로는, 서버는 클라이언트의 요청을 받고, 연결을 수락하는 의미로 SYN-ACK 세그먼트를 클라이언트에게 보냅니다. 이 패킷에는 서버의 초기 순서 번호와 클라이언트의 초기 순서 번호에 1을 더한 확인 응답 번호가 포함됩니다.
마지막으로, 클라이언트는 서버의 SYN-ACK 세그먼트를 수신한 후, ACK 세그먼트를 서버에 보내며 연결이 완료됨을 알립니다. 이 패킷에는 클라이언트의 다음 순서 번호와, 서버에 대한 확인 응답 번호가 포함됩니다.
Q. 포웨이 핸드셰이크 과정을 설명하세요
이는 TCP가 연결을 종료하는 과정을 말합니다.
먼저, 연결을 종료하고자 하는 클라이언트가 서버에 FIN세그먼트를 보냅니다. 연결 수립 상태인 ESTABLISHED에서 FIN_AIT-1 상태로 접어들게 됩니다.
그 다음으로는, 서버는 클라이언트의 FIN 세그먼트를 수신한 후, 확인을 위해 ACK 세그먼트를 보냅니다. 이 시점에서 클라리언트는 더이상 데이터를 전송하지 않고, 서버는 ESTABLISHED 상태에서 CLOSE-WAIT 상태가 되며, 대기하는 상태가 됩니다. 클라이언트가 이 fin 세그먼트를 수신하면, 클라이언트는 서버의 FIN 세그먼트를 기다리는 FIN-WAIT-2상태가 됩니다.
세번째로, 서버도 연결을 종료할 준비가 되면 FIN 세그먼트를 보냅니다. 그리고, 클라리언트의 ACK 세그먼트를 기다리는 LAST-ACK 상태가 됩니다.
마지막으로, 클라이언트가 FIN 세그먼트를 확인하기 위해 ACK 세그먼트를 서버에 보냅니다. 이 단계에서 클라이언트가 TIME-WAIT 단계가 상태가 되었다가, 일정한 시간을 기다린 후 CLOSED 상태로 변하며 연결이 종료됩니다.
'천재적인 CS > 네트워크' 카테고리의 다른 글
TCP의 오류 제어, 흐름 제어, 혼잡 제어 (0) | 2024.09.25 |
---|---|
네트워크 전송 계층이란 (0) | 2024.09.23 |
네트워크 HTTP, HTTPS (1) | 2023.12.16 |
CS 네트워크 기기 (0) | 2023.12.14 |
네트워크 분류 (0) | 2023.11.29 |