2017-12-04 11 views
0

저레벨의 패킷 리더 (wireshark와 같은)를 학습 목적과 재미로 만들려고합니다.TCP 스트림의 끝을 나타내는 것은 무엇입니까?

http 구문 분석으로 이동하면 이러한 TCP 스트림이 있고 그 데이터가 모두 하나의 패킷으로 제공되는 것은 아니라는 것을 금방 알게되었습니다.

편집 : 내가 들었던 스트림으로 생각하는 것은 올바른 용어가 아닙니다. David Schwartz는 쿼리으로, EJB는 세그먼트 시퀀스으로 언급했습니다.

그래서 나는 TCP에 약간의 독서를했고, 나는 이미의 지식을했다 순서확인 번호, 그들은 증가 등 주변 포장 방법 ..
연결 설정 및 종료에 대한 모든 곳에서 읽었습니다 .

나는 해석이나 Google을 잘 사용 해본 적이 없지만 조금만 봤는데 서버/클라이언트가 어떻게되는지 이해할 수 없다. TCP 흐름.

http 요청의 전체를 보낸 후 서버가 즉시 페이지에 응답하므로 wireshark에서 패킷을 통해 전달하고 전달할 수 없기 때문에 이 스트림을 구분하는 것을 찾으십시오 (첫 번째 패킷의 길이 또는 마지막에서 두 번째 패킷까지의 차이를 나타내는 모든 것).

TCP에 실제 구분 기호가 없으며 http 헤더의 Content-Length에서 전체 길이를 얻을 수 있습니까? 여기에서 알 수있는 바와 같이

http request

, 제 3 개 패킷은 접속 설정이다.
그 후 3은 http 요청 (처음에는 ACK (선택된 것)이고, 최신 2는 PSH & ACK입니다)의 전송입니다. 그 다음 두 개는 서버의 ACK이며 응답 전체가 이어집니다.
마지막 하나는 나의 ACK이고 "기록한"시간 동안 연결이 닫히지 않습니다.

감사합니다.

+1

이 질문에 대한 답변이 있습니까? https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination –

+0

@OliverCharlesworth'연결 설정 및 종료 이미 지식이 있습니다.' – TrisT

+1

HTTP 스펙은 조회의 끝을 찾는 f}을 설명합니다. TCP 수신 스트림을 HTTP 파서 입력에 연결해야합니다. –

답변

1

TCP 스트림의 끝 부분에는 FIN 비트가 전송 된 세그먼트가 표시됩니다.

즉 의해 결정되는 HTTP 요청 또는 응답의 종료에 관한 당신의 진짜 질문에 대한 대답, 아니다 그러나

: 존재하는 경우,

  1. 콘텐츠 길이, 또는
  2. 청크 분할 전송에
  3. 최종 청크는 FIN

본체가 있으면 아래 @Barmar 지적한 바와 같이 헤더 이후 달리 공백 라인을 사용하는 경우, 또는

  • .

  • +1

    이것은'POST'와'PUT' 요청 에서처럼 몸체를 포함하고있는 요청에 대해서만 유효합니다. 'GET'에는 본문이 없으므로 요청은 헤더 다음의 빈 줄에서 끝납니다. – Barmar

    +0

    "스트림"과 "연결"은 같은 의미입니까? HTTP 요청/응답과 같은 것으로부터 보았을 때 여러 세그먼트가있을 수 있습니다. 연결을 유지할 수 있기 때문에 스트림이라고 생각했습니다. 내가 묻는 것은 "마지막 덩어리"에 관한 것입니다. 최종 덩어리인지 어떻게 알 수 있습니까? – TrisT

    +0

    @TrisT 예, 그들은 똑같습니다. 마지막 덩어리는 정확하게 기억한다면 길이가 0입니다. 그것은 모두 RFC 2616에 있습니다. 그러나 청크에 대한 요청 본문이 없으므로 GET 요청에는 청크가 없습니다. – EJP