TCP 프로토콜의 통신 과정
아마 팩스의 5단계 핸드셰이크와 매우 유사한 3단계 핸드셰이크를 말씀하시는 것 같습니다.
다음 정보가 귀하에게 도움이 되기를 바랍니다.
TCP/IP는 실제로는 TCP 사용자 데이터 보고 프로토콜(TCP User Data Reporting Protocol)이라는 프로토콜 그룹으로, 다양한 프로토콜로 구성되어 있습니다. >
TCP Transport Control Protocol이라고 합니다. 먼저, Transport Control Protocol이 네 번째 계층의 이름이라는 점을 강조하고 싶습니다. OSI 네트워크, TCP. TCP/IP 전송의 6가지 기본 프로토콜 중 하나입니다. 두 TCP는 서로 다른 의미를 갖습니다. TCP는 안정적인 연결 지향 전송 서비스입니다.
데이터를 세그먼트 단위로 전송하며, 데이터를 교환하려면 호스트가 세션을 설정해야 합니다. 이는 비트스트림을 사용하여 통신합니다. 즉, 데이터
는 구조화되지 않은 바이트 스트림으로 처리됩니다. 시퀀스 번호는 신뢰성을 위해 각 TCP 전송의 필드를 통해 할당됩니다. OSI 참조 모델의 네 번째 계층입니다. TCP는 IP의 네트워크 간 상호 연결 기능을 사용하여 안정적인 데이터 전송을 제공합니다.
TCP는 패킷이 도착하는지 확인하는 역할을 담당합니다. 협업 IP 운영에서 TCP는 핸드셰이크 프로세스, 메시지 관리, 흐름 제어, 오류 감지 및 처리(제어)를 담당하며 특정 번호 지정 순서에 따라 비정상적인 순서를 처리할 수 있습니다.
메시지 재배치됩니다. TCP에 관한 RFC 문서에는 RFC793, RFC791 및 RFC1700이 포함됩니다.
TCP 세션의 초기 단계에는 소위 "3방향 핸드셰이크"가 있습니다. 즉, 데이터 세그먼트의 송수신이 이루어지도록 매번 전송되는 데이터의 양을 추적하는 방법을 협상하는 것입니다. 동기화됨 수신된 데이터의 양과 데이터 송수신 후 연결을 취소하고 가상 연결을 설정하는 시점에 따라 결정되는 데이터 확인 횟수입니다. 안정적인 전달을 제공하기 위해 TCP는 새 데이터를 보내기 전에 특정 순서로 데이터 패킷에 번호를 매기고 이러한 패킷이 대상 시스템에 전달된 후에 승인 메시지를 요구합니다. TCP는 대량의 데이터를 전송하는 데 항상
사용됩니다. TCP는 애플리케이션이 데이터 수신 후 확인이 필요한 경우에도 사용됩니다. TCP는 항상 추적되어야 하므로 추가 오버헤드가 필요하므로 TCP 형식이 다소 복잡해집니다. 나중에 MITNICK 공격이라고 불리는 전형적인 TCP 사례를 살펴보겠습니다. 케빈은
TCP 세션 하이재킹
SYN FLOOD(동기 플러드) p>
여기에서는 TCP 세션 하이재킹 문제에 대해 논의합니다.
먼저 TCP 연결을 설정하는 기본적이고 간단한 과정을 살펴보겠습니다. 소규모 시뮬레이션 환경을 구축하기 위해 3대의 머신이 인터넷에 연결되어 있다고 가정합니다. A는 공격자가 조종하는 공격기이다. B는 중간 스프링보드 머신(신뢰할 수 있는 서버)입니다. C는 피해자가 사용하는 머신(주로 서버)입니다. 여기서 C 머신은 대상 머신으로 잠겨 있습니다. 머신 A는 머신 B에게 SYN 패킷을 보내
연결 설정을 요청합니다. 이때 요청에 응답한 머신 B는 머신 A에 SYN/ACK
로 응답합니다.는 연결 설정에 동의했음을 나타냅니다. A 머신이 B 머신에서 보낸 SYN/ACK 응답을 받으면 응답 ACK를 보내 머신 A와 B 간의 네트워크 연결을 설정합니다. 이러한 방식으로 두 시스템 간의 TCP 통신 채널이 성공적으로 설정됩니다.
터미널 B의 신뢰할 수 있는 서버는 시스템 C에 대한 TCP 연결을 시작하고 시스템 A는 서버에 대한 SYN 메시지를 시작하므로 시스템 C는 시스템 B에 응답할 수 없습니다.
시스템 C는 시스템 B에 응답할 수 없습니다.
동시에 머신 A는 머신 C가 응답한 가짜 SYN 패킷을 머신 B로 보냅니다.
SYN 패킷을 받은 후 머신 B(머신 C가 신뢰하는)는 이에 대한 응답으로 SYN/ACK 데이터를 보내기 시작합니다.
이때, 머신 C는 이전에 전송된 SYN 데이터에 응답하느라 바빠서 머신 B에 응답할 시간이 없으며, 머신 A의 공격자는 예측합니다
머신 B의 패킷의 시퀀스 번호(이제는 TCP 시퀀스 번호를 예측하기가 더 어렵습니다.) 가짜 머신 C는 머신 B에 응답 ACK를 보냅니다. 이때 공격자는 머신 B를 신뢰하고 머신 C를 위조하여 머신 B와 TCP 프로토콜 대화를 설정합니다. 연결
연결. 현재 머신 C는 공격자 머신 A가 보낸 SYN 데이터에 여전히 응답하고 있습니다.
TCP 프로토콜 스택의 약점: 패킷 정보, 조건 상태, 시퀀스 번호 등을 포함한 TCP 연결의 리소스 소비
연결을 설정하는 데 필요한 3방향 핸드셰이크 프로세스를 고의로 완료하지 않음으로써 연결된 당사자의 리소스가 고갈됩니다.
공격자는 연결을 설정하는 데 필요한 전체 3방향 핸드셰이크 프로세스를 의도적으로 완료하지 않아 C 시스템의
리소스가 고갈됩니다. 연결 요청에 응답할 때 대상 호스트가 반환하는 SYN/ACK의 시퀀스 번호인 시퀀스 번호의 예측 가능성은 예측 가능합니다.
(초기 TCP 프로토콜 스택에 대한 자세한 내용은 1981년에 출판된 TCP 프로토타입에 대한 RFC793 문서를 참조하세요.)
TCP 헤더 구조
TCP 프로토콜 헤더는 최소한 다음 영역을 포함하는 20바이트(번역이 동일할 수밖에 없으므로 해당 영어 단어가 기사에 제공됨):
TCP 소스 포트: 포트가 포함된 16비트 소스 포트 통신을 초기화하는 중입니다. 소스 포트와
소스 IP 주소는 보고서의 반환 주소를 나타내는 데 사용됩니다.
TCP 대상 포트: 16비트 대상 포트 필드는 전송 목적을 정의합니다. 이 포트는 메시지를 수신하는 컴퓨터의 애플리케이션 주소 인터페이스를 나타냅니다.
TCP 시퀀스 번호(Sequence Number): 32비트 시퀀스 번호는 수신 컴퓨터에서 새로 분할된 메시지를 원래 형식으로 다시 표시하는 데 사용됩니다.
SYN이 나타나면 시퀀스 코드는 실제로 ISN(초기 시퀀스 번호)이고 첫 번째 데이터 바이트는 ISN+1입니다. 이 시퀀스 번호(시퀀스 코드)는 전송 불일치를 보상하는 데 사용됩니다.
TCP 승인 번호: 수신 컴퓨터에서 분할된 메시지를 원래 형식으로 재조립하는 데 사용되는 32비트 시퀀스 번호입니다. , ACK 제어 비트가 설정된 경우 이 값은 수신할 패킷의 시퀀스 코드를 나타냅니다.
데이터 오프셋(HLEN): TCP 헤더 크기를 포함하는 4비트로 데이터가 시작되는 위치를 나타냅니다.
예약됨: 6비트 값 필드, 이 비트는 0이어야 합니다. 새로운 용도에 대한 향후 정의를 위해 예약되어 있습니다.
플래그(코드 비트): 6비트 플래그 필드입니다. 비상 플래그, 의미 있는 응답 플래그, 푸시, 재설정
연결 플래그, 동기화 시퀀스 번호 플래그 및 데이터 전송 완료 플래그로 표시됩니다. 순서대로 URG, ACK, PSH,
RST, SYN, FIN입니다.
Window(창): 16비트, 수신하려는 각 TCP 데이터 세그먼트의 크기를 나타내는 데 사용됩니다.
체크섬: 16비트 TCP 헤더. 소스 머신은 데이터 내용을 기반으로 값을 계산하고, 수신 머신
은 소스 머신과 정확히 동일한 수치 결과를 얻어야 데이터의 유효성이 입증됩니다.
우선순위 포인터(긴급 포인터): 16비트, 바이트와 우선순위 데이터를 가리키며 URG
플래그가 설정된 경우에만 유효합니다. URG 플래그가 설정되지 않은 경우 비상 필드가 채워집니다. 긴급으로 표시된 데이터 세그먼트를 신속하게 처리합니다
.
옵션: 길이는 가변적이지만 길이는 바이트 단위여야 합니다.
옵션이 없으면 이 1바이트
필드가 0이라는 의미입니다.
패딩: 가변 길이, 패딩 내용은 0이어야 하며 수학적 목적으로 존재합니다. 목적은 공간의 예측 가능성을 보장하는 것입니다. 헤더와 데이터 시작 부분의 오프셋 조합이 32로 나누어지는지 확인합니다. 일반적으로 TCP 헤더가 32비트의 정수 배수가 되도록 추가 0을 사용합니다.
플래그 제어 기능
URG: 긴급 플래그
긴급(긴급 포인터) 플래그가 유효합니다. 비상 플래그가 설정되었습니다.
ACK: 승인 플래그
승인 번호 필드가 유효합니다. 대부분의 경우 이 플래그가 설정됩니다.
TCP 헤더의 승인 번호 열에 포함된 승인 번호(w+1, 그림: 1)는 다음으로 예상되는 시퀀스 번호이며, 동시에
그것은 원격 시스템에 모든 데이터가 성공적으로 수신되었다는 메시지가 표시됩니다.
PSH: 푸시 플래그
이 플래그가 설정되면 수신측에서는 데이터를 대기열에 넣지 않고 최대한 빨리 데이터를 애플리케이션에 전송합니다.
프로세스. 이 플래그는 Telnet 또는 rlogin과 같은 대화형 모드 연결을 처리할 때 항상 설정됩니다.
RST: 재설정 플래그
재설정 플래그가 유효합니다. 해당 TCP 연결을 재설정하는 데 사용됩니다.
SYN: 동기화 플래그
동기화 시퀀스 번호 열이 유효합니다. 이 플래그는 3방향 핸드셰이크 중에 TCP 연결을 설정할 때만 유효합니다. TCP 연결 시작자(일반적으로 클라이언트)의 초기 시퀀스 번호인 시퀀스 번호를 확인하라는 메시지를 TCP 연결 서버에 표시합니다. 여기서 TCP 시퀀스 번호는 0~4,
294, 967, 295 범위의 32비트 카운터로 간주할 수 있습니다. TCP 연결을 통해 교환되는 각 데이터 바이트에는 시퀀스 번호가 지정됩니다.
TCP 헤더의 시퀀스 번호 필드에는 TCP 세그먼트의 첫 번째 바이트의 시퀀스 번호가 포함됩니다.
FIN: 종료 플래그
이 플래그가 설정된 데이터 패킷은 TCP 응답을 종료하는 데 사용되지만 해당 포트는 여전히 열려 있습니다.
다음 수신 준비 데이터.
서버는 청취 상태이고 클라이언트가 연결 요청을 설정하는 데 사용하는 데이터 패킷(IP 패킷)은 TCP/IP에 따라 TCP에서 처리되는 세그먼트로 결합됩니다.
프로토콜 스택.
헤더 정보 분석: TCP 계층은 해당 TCP 및 IP 헤더를 수신하고 이 정보를 메모리에 저장합니다.
TCP 체크섬 확인: 표준 체크섬은 세그먼트에 있습니다(그림: 2). 확인에 실패하면
승인이 반환되지 않고 세그먼트가 삭제되며 클라이언트는 재전송을 기다립니다.
PCB{}(조회 프로토콜 제어 블록): TCP는 이 연결과 연관된 프로토콜 제어 블록을 찾습니다. 찾지 못하면 TCP는 세그먼트를 버리고 RST를 반환합니다. (TCP가 포트 청취 없이 상황을 처리하는 방법입니다.)
프로토콜 제어 블록이 존재하지만 상태가 닫힌 경우 서버는 connect() 또는 listening()을 호출하지 않습니다. 세그먼트는 삭제되지만 RST는 반환되지 않습니다
. 클라이언트는 연결 요청을 다시 설정하려고 시도합니다.
새 소켓 생성: 수신 상태의 소켓이 세그먼트를 수신하면 하위 소켓이 생성됩니다.
소켓{}, tcpcb{} 및 pub도 있습니다. {}설립하다. 이때 에러가 발생하면 플래그 비트를 통해 해당 소켓과 메모리가 제거되어 TCP 연결이 실패하게 된다. 캐시 대기열이 가득 차면 TCP는 오류가 발생한 것으로 간주하고 이후의 모든 연결 요청이 거부됩니다.
여기에서 SYN Flood 공격이 어떻게 작동하는지 확인할 수 있습니다.
폐기: 세그먼트의 플래그가 RST 또는 ACK이거나 SYN 플래그가 없는 경우 세그먼트가 폐기됩니다.
그리고 해당 메모리를 해제하세요.
순차 변수 보내기
SND.UNA: 승인되지 않은 보내기
SND.NXT: 다음 보내기
SND.WND: 보내기 창
SND.UP: 우선 순위 포인터 보내기
SND.WL1: 마지막 창 업데이트에 사용되는 세그먼트 시퀀스 번호
SND.WL2: 마지막 창에 사용 업데이트된 세그먼트 확인 번호
ISS: 초기 전송 시퀀스 번호
수신 시퀀스 번호
RCV.NXT: 다음 수신
RCV .WND: 다음 수신
RCV.UP: 수신 우선순위 포인터
IRS: 초기 수신 시퀀스 번호
현재 세그먼트 변수
SEG.SEQ: 세그먼트 시퀀스 번호
SEG.ACK: 세그먼트 확인 표시
SEG.LEN: 세그먼트 길이
SEG.WND: 세그먼트 창
SEG. UP: 세그먼트 비상 포인터
SEG.PRC: 세그먼트 우선순위
CLOSED는 연결이 없음을 의미합니다.
LISTEN: 원격 TCP 포트의 연결 요청을 수신합니다.
SYN-SENT: 연결 요청을 보낸 후 일치하는 연결 요청을 기다립니다.
SYN-RECEIVED: 연결 요청을 수신하고 보낸 후 연결 요청 확인을 기다립니다.
ESTABLISHED: 열린 연결을 나타내며 데이터가 사용자에게 전송될 수 있습니다.
FIN-WAIT-1: 원격 TCP 연결 중단 요청 또는 이전 연결 중단 요청 확인을 기다립니다.
FIN-WAIT-2: 원격 TCP의 연결 중단 요청을 기다립니다.
CLOSE-WAIT: 로컬 사용자의 연결 중단 요청을 기다립니다.
CLOSING: 원격 TCP가 연결 중단을 확인하기를 기다리는 중입니다.
LAST-ACK: 원래 원격 TCP로 보낸 연결 중단 요청에 대한 승인을 기다립니다.
TIME-WAIT: 원격 TCP가 연결 중단 요청에 대한 승인을 받을 수 있도록 충분한 시간을 기다립니다.
CLOSED: 연결 상태가 없습니다.
TCP 연결 프로세스는 상태 전환을 발생시키는 것은 사용자의 호출(OPEN, SEND,
RECEIVE, CLOSE, ABORT 및 STATUS)입니다. 전송된 데이터 세그먼트, 특히 다음 태그를 포함하는 세그먼트
데이터 세그먼트 SYN, ACK, RST 및 FIN. 타임아웃도 있는데, TCP 상태가 변경되면 위에서 언급한 상황이 발생합니다.
순서 번호
TCP 연결에서 보내는 바이트에는 순서 번호가 있습니다. 번호가 매겨져 있으므로 영수증을 확인할 수 있습니다
. 일련번호 확인은 누적됩니다. TCP가 수행해야 하는 시퀀스 번호 비교 작업 유형은 다음과 같습니다.
① 전송되었지만 확인되지 않은 일부 시퀀스 번호를 확인합니다.
②모든 일련번호가 수신되었는지 확인합니다.
③다음 세그먼트에 포함될 시퀀스 번호를 결정합니다.
확인을 받기 위해 TCP에서 보낸 데이터의 경우 확인을 수행해야 합니다.
SND.UNA = 가장 오래 확인된 시퀀스 번호.
SND.NXT = 전송될 다음 시퀀스 번호입니다.
SEG.ACK = TCP 승인을 받고 TCP에서 예상하는 다음 시퀀스 번호를 받습니다.
SEG.SEQ = 데이터 세그먼트의 첫 번째 시퀀스 번호입니다.
SEG.LEN = 데이터 세그먼트에 포함된 바이트 수.
SEG.SEQ+SEG.LEN-1 = 데이터 세그먼트의 마지막 시퀀스 번호입니다.
데이터 세그먼트의 시퀀스 번호가 확인 번호보다 작거나 같으면 전체 데이터 세그먼트가 확인됩니다. 그리고
데이터를 수신할 때 다음 비교 작업이 필요합니다:
RCV.NXT = 예상 시퀀스 번호와 수신 창의 가장 낮은 가장자리.
RCV.NXT+RCV.WND: 1 = 마지막 시퀀스 번호와 수신 창의 가장 높은 가장자리.
SEG.SEQ = 수신된 첫 번째 시퀀스 번호입니다.
SEG.SEQ+SEG.LEN: 1 = 수신된 마지막 시퀀스 번호.