TCP 데이터 전송의 reliability ???

swunk의 이미지

TCP로 예를 들어 HTTP의 get으로 2~3메가 정도의 데이터를 메모리에 다운받고, 이를 다시 플래쉬에 write하여 재부팅하는 시스템이 있습니다.

이러한 상황에서 TCP로 다운받은 데이터의 무결성은 보장이 되나요 ? TCP의 체크섬 계산이 CRC 체크만 한다면 일부 값이 변경되어도 CRC 계산에서는 검출이 안될것이고 이를 플래쉬에 그대로 write를 하고 체크섬 계산을 해도 정상으로 결과가 나올것이며 이를 재부팅 시도하면 그때서야 문제가 나오는 상황인것으로 추정되어 문의 드립니다.

즉, TCP로 (HTTP 혹은 FTP 등으로) 다운 받은 데이터의 무결성이 100% 보장되나요 ?

feanor의 이미지

세상에 100%라는 건 없습니다. 불안하면 체크섬 직접 한번 더 하셔야죠.

dorado2의 이미지

feanor님 말씀대로 md5sum 등의 체크섬을 추가로 한번 더 하시는게 좋겠네요.

Fedora나 Ubuntu iso 파일을 http, ftp로 배포할 때도 md5sum 파일을 같이 올려두잖아요.
그것처럼 원본 파일을 바탕으로 생성한 md5sum 파일을 올려두시고 원본 파일과 md5sum 파일을 받아서
체크하심 될 것 같습니다.

swunk의 이미지

그렇다면 TCP 레벨에서 서버에서 1000바이트를 보낸것을 클랑이언트네서 1000바이트 다 받았고 체크섬 계산에서 넘어 갔다고 해도, 서버에서 보낸 원본값과 클랑이언트에서 수신한 값이 다를 수 있다는 거네요 ?

즉, TCP 레벨에서 각각의 세그먼트에 대해 체크섬 ok 가 났다고 해서 모든 비트에대해서 reliablity가 보장되는 것은 아닌거네요 ? 그게 맞다면 TCP의 reliable 의 기준은 bit 레벨이 아닌 segment 레벨이다. 정도가 될것이고 segment 내에서 (헤더가 아닌) 데이터의 비트열이 일부 바뀐경우에는 검출이 불가능 하다. 라고 이해하면 될까요 ?

고수님들의 답변 부탁합니다.

kslee80의 이미지

TCP 프로토콜이 그렇게나 unreliable 한 녀석은 아닙니다.;;
물론, 다른 분들이 말씀하신 것처럼 100% 를 보장할 수는 없지만,
99.8% 는 된다고 생각됩니다.

물론, 물리적 연결 상태가 좋지 않다면 문제가 발생할 확률은 그만큼 높아지겠죠.

mach의 이미지

강력했던(?) 해쉬알고리즘인 MD5조차도 안전하지 않고, sha2로 가는게 권고가 된 현실에서,
TCP 체크섬 알고리즘(16비트 체크섬)이 100% 무결성(integrity)을 보장한다고 보기 어렵지요.
TCP의 특성상 플로우 제어, 순서제어등이 파라메터처럼 움직여서, 보다 충돌 확률을 낮출 수 있을 것으로도
예측해 봅니다.

그리고,....
google에서 internet+data+error+rate+TCP+empirical로 검색해서 논의한 내용을 찾아보면,
확률적으로 -7승(1/10,000,000)의 충돌(에러 미검출) 가능성이 있다는 의견이 있습니다.(http://stackoverflow.com/questions/902938/error-rate-in-tcp-checksum) 1비트의 에러라도 검출된다면 재전송에 의해 안전하게 전송되겠지요. 단지, 에러가 아주 교묘하게(?) 발생하여 체크섬 루틴을 우회하는 경우가 생길 수 있는 경우(충돌이란 표현으로 얘기해봅니다)가 문제겠습니다. 사실, 이러한 가능성을 완전하게 배제하기 어렵지만, 이를 예시하는 경우는 거의 보지 못했습니다.

보다, 안전하게 하기 위해서는, 전송하는 파일을 hash함수(sha2?)에 통과시키고 검증하는 루틴을 추가하여, 에러 미검출 가능성을, 낮추어야, 보다 안전할 것 같습니다.
(위에 두분께서 언급하신 내용이지요.)

그리고, 질문자님의 문제가 tcp문제가 아닌, 다른 문제가 아닌지에 대한 가능성도 배제해서는 안된다는 의견입니다.

* 자칫 TCP를 비신뢰적으로 인지하는 분들이 있을까 우려스러워 답변해 봅니다. 처음, 시작하시는 분들은, 기본적으로 TCP는 신뢰적이라는 개념을 가지고 프로그래밍에 입문하셔야 할 것입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.