문제

TCP/IP가 동일한 패킷의 여러 사본이 대상에 도달하는 것을 방지합니까? 아니면 그 위의 계층 Idempotency 논리에 대한 종말점에 달려 있습니까?

가능한 경우 TCP/IP 사양의 특정 단락을 참조하십시오.

도움이 되었습니까?

해결책

중복 패킷에서 복구하는 것은 TCP 스택의 작업입니다.

TCP는 인터넷 통신 시스템에 의해 손상, 손실, 복제 또는 전달 된 데이터에서 복구해야합니다. 이는 전송 된 각 옥트에 시퀀스 번호를 할당하고 수신 TCP로부터 긍정적 인 승인 (ACK)을 요구함으로써 달성된다. 시간 초과 간격 내에 ACK가 수신되지 않으면 데이터가 재전송됩니다. 수신기에서, 시퀀스 번호는 순서 부서에서 수신 될 수있는 세그먼트를 올바르게 주문하고 복제물을 제거하는 데 사용됩니다. 전송 된 각 세그먼트에 체크섬을 추가하여 수신기에서 확인하고 손상된 세그먼트를 폐기하여 손상이 처리됩니다.

-- RFC 793 - 전송 제어 프로토콜, 섹션 1.5

그러나 새로운 시퀀스 번호가있는 동일한 패킷이라면 아니요.

다른 팁

TCP는 시퀀스 번호를 사용하여 재전송의 경우 복제를 감지하며, 이는 사소한 재생 공격을 방지합니다.

RFC 793, 섹션 3.3- 시퀀스 번호 :

설계의 기본 개념은 TCP 연결을 통해 전송 된 모든 옥셋에 시퀀스 번호가 있다는 것입니다. 모든 낙지는 시퀀싱되므로 각각은 인정 될 수 있습니다. 사용 된 승인 메커니즘은 누적이므로 서열 번호 X의 승인은 X를 포함하지만 포함하지 않은 모든 옥셋이 수신되었음을 나타냅니다. 이 메커니즘을 사용하면 재전송이있을 때 간단한 중복 감지를 허용합니다. 세그먼트 내에서 옥셋의 번호 매기기는 헤더 바로 뒤에있는 첫 번째 데이터 옥켓이 가장 낮은 번호가 가장 낮고 다음 옥트는 연속적으로 번호가 매겨진다는 것입니다.

중복 감지는 동일한 패킷을 사소하게 재고 할 수 없도록합니다. 시퀀스 번호는 또한 데이터 스트림에 데이터의 삽입 (교체가 아닌)이 발견되도록 보장 할 것입니다. 위조 패킷에 따른 추가 합법적 인 패킷에는 중복 시퀀스 번호가있어 데이터 흐름을 방해 할 것입니다. 이로 인해 해당 패킷이 복제로 떨어질 수 있으므로 사용되는 프로토콜이 파괴 될 수 있습니다.

원본 (1981) TCP/IP 사양에 대한 자세한 내용은 RFC 793, 및 TCP/IP 프로토콜에 대한 확장 또는 수정을 포함하는 다른 많은 RFC.

예, TCP 층은 중복 패킷을 방지합니다. 아래의 IP 계층은 그렇지 않습니다.

세부 사항 RFC 1122.

당신은 두 가지 다른 것에 대해 걱정하는 것 같습니다.

  1. TCP 신뢰할 수있는 배송이 제공하는 것은 무엇입니까?
  2. 공격자가 재생 공격으로 내 서버 프로세스에 영향을 줄 수 있습니까?

1에 대한 답변 :

TCP는 일련의 바이트 시퀀스를 신뢰할 수 있고 사역 전달을 보장합니다. 클라이언트 애플리케이션이 TCP를 통해 전송하는 데이터 write() 서버의 동안 정확히 똑같이 나옵니다. read() 전화.

2에 대한 답변 :

모든 연결은 클라이언트와 서버가 각각 생성 한 2 개의 임의의 32 비트 숫자에 의존하기 때문에 재생 공격은 TCP와 잘 작동하지 않습니다. 재생 공격이 작동하려면 공격자는 시작하는 가짜 연결에 대해 서버가 생성 한 시퀀스 번호를 추측해야합니다 (이론적으로 공격자는 AA 1 / 2 ** 32 올바른 기회 를가집니다). 공격자가 잘못 추측하면 최악의 경우 OS에서 데이터를 버퍼링 할 것입니다.

재생 공격이 작동하지 않기 때문에 공격자가 서버와 합법적 인 연결을 형성하고 응용 프로그램에 원하는 데이터 스트림을 전송하는 것을 방해하는 것은 없습니다. 이것이 중요한 이유입니다 항상 입력을 검증하십시오.

TCP 아래의 레이어는 여러 패킷이나 떨어진 패킷을 경험할 수 있습니다. TCP 위의 층은 반복 또는 삭제 된 패킷을 경험하지 않습니다.

패킷 회복에 대해 모르겠지만 TCP/IP를 사용하여 결코 발생하지 않았으며 패킷이 모두 도착하고 올바른 순서로 보장되므로 왜 그렇지 않은지 이해할 수 없습니다.

실제로 데이터를 수신하는 방법에 따라 다릅니다. 기술적으로 프로토콜이 중복을 제공해서는 안되지만 (예 : 동일한 TCP 체크섬이있는 패킷) 다른 요인으로 인해 중복을 볼 수 있습니다. 또한 애플리케이션에서 열린 소켓을 읽는 대신 스니퍼를 사용하여 TCP 스트림을 보는 경우 모니터링중인 실제 TCP 스트림에 DUP 패킷이 없었더라도 스 니퍼에서 DUP 패킷을 얻을 수 있습니다.

실제 예제를 제공하기 위해 - 현재 주요 증권 거래소를위한 내부 네트워크에 대한 일부 TCP 분석 작업을 수행하고 있으며, 내가보고있는 데이터는 여러 스 니퍼에서 나오고 다시 연결되는 것입니다. 따라서 데이터를 가져 오면서 복제물 찾기 및 제거를 포함하여 여러 사전 처리 단계를 수행해야한다는 것을 알았습니다. 예를 들어, 방금 읽은 스트림에서 약 60,000 개의 데이터 패킷으로 95 개의 중복 패킷을 찾아 제거했습니다.

내가 여기서 취하는 전략은 가장 최근의 TCP 체크섬의 롤링 윈도우를 유지하고 해당 체크섬과 일치하는 패킷을 무시하는 것입니다. 이것은 PSH 패킷에 적합하지만 ACK 패킷에는 적합하지는 않지만 어쨌든 그에 대해 덜 관심이 없습니다.

TCP 체크섬 의이 롤링 창을 추적하기 위해 특별 컬렉션을 작성했습니다.

/// <summary>
/// Combination of a double-linked-list and a hashset with a max bound; 
/// Works like a bounded queue where new incoming items force old items to be dequeued; 
/// Re-uses item containers to avoid GC'ing;
/// Public Add() and Contains() methods are fully thread safe through a ReaderWriterLockSlim;
/// </summary>
public class BoundedHashQueue<T>
{
    private readonly int _maxSize = 100;
    private readonly HashSet<T> _hashSet = new HashSet<T>();
    private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
    private readonly Item _head;
    private readonly Item _tail;
    private int _currentCount = 0;

    public BoundedHashQueue(int maxSize)
    {
        _maxSize = maxSize;
        _head = _tail = new Item();
    }

    private class Item
    {
        internal T Value;
        internal Item Next;
        internal Item Previous;
    }

    public void Add(T value)
    {
        _lock.Write(() =>
            {
                if (_currentCount == 0)
                {
                    Item item = new Item();
                    item.Value = value;
                    _head.Next = item;
                    item.Previous = _head;
                    item.Next = _tail;
                    _tail.Previous = item;
                    _currentCount++;
                }
                else
                {
                    Item item;
                    if (_currentCount >= _maxSize)
                    {
                        item = _tail.Previous;
                        _tail.Previous = item.Previous;
                        _tail.Previous.Next = _tail;
                        _hashSet.Remove(item.Value);
                    }
                    else
                    {
                        item = new Item();
                        _currentCount++;
                    }
                    item.Value = value;
                    item.Next = _head.Next;
                    item.Next.Previous = item;
                    item.Previous = _head;
                    _head.Next = item;
                    _hashSet.Add(value);
                }
            });
    }

    public bool Contains(T value)
    {
        return _lock.Read(() => _hashSet.Contains(value));
    }
}}

당신은 문제를 완전히 이해하지 못합니다. 이 링크 참조 :http://en.wikipedia.org/wiki/transmission_control_protocol

이 페이지에는 다음이 있습니다.

"RFC 1323에 정의 된 TCP 타임 스탬프는 TCP가 발신자와 수신기 간의 왕복 시간을 계산하는 데 도움이됩니다. 타임 스탬프 옵션 옵션은 4 바이트 타임 스탬프 값이 포함되며, 여기서 발신자는 타임 스탬프 시계의 현재 값을 삽입합니다. 수신기가 일반적으로 수신 한 가장 최근의 타임 스탬프 값을 삽입하는 Echo Reply Timestamp 값. 발신자는 승인 된 세그먼트가 전송 된 이후 총 경과 시간을 계산하기 위해 Echo Reply Timestamp를 사용합니다. [2

TCP 타임 스탬프는 또한 TCP 시퀀스 번호가 2^32 바운드와 시퀀스 숫자 공간을 "랩"하는 경우에도 도움이됩니다. 이 체계는 랩핑 된 시퀀스 번호 또는 발에 대한 보호로 알려져 있습니다 (자세한 내용은 RFC 1323 참조). "

안부, 공동 (폴란드)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top