TCP 스트리밍의 세그먼트, 세그먼트 정보

9448 단어 TCP

TCP 스트리밍의 세그먼트, 세그먼트 정보


TCP를 배울 때 TCP는 유형으로 해석된다.
쉽게 연상되는 UDP에서 UDP는 데이터 보고서를 처리하는 프로토콜이다.데이터 보고서는 말 그대로 데이터로 하나의 데이터를 발송할 때 하나의 UDP를 생성하여 그룹을 나누어 발송한다.(MSS 범위)

참조 소스: https://www.techscore.com/tech/Java/JavaSE/Network/4/
다른 한편, TCP에서는 휴면 핸드폰에 연결을 붙여 넣은 후 연결이 끊기기 전에 흐르는 전송을 하는 데이터 교환 행위를 한다.
덧붙여 말하자면 플러그인 통신에서 수신측recv가 송신측send의 데이터를 보낸 경우send가 여러 번이라도recv는 한데 모인다.(상반되는 경우도 있다) 유형의 성질은'send와recv가 1대1이 되는 것을 보장하지 않는다'는 것이다.

의문


TCP 프로토콜의 데이터 중단을 규정하는 이유는 무엇입니까?그러니까
예를 들어 TCP를 통해'안녕하세요'라는 단어를 보낼 때 수신자는'안녕하세요'를 받아도 문자를 계속 사용할지 여부를 판단할 수 없다.
그럼 어디선가 "안녕하세요(마지막이네요)"라는 메시지를 보낸 건 아닐까요?아니면 TCP 흐름의 세그먼트를 다른 방법으로 나타낼까요?제가 조사하고 싶은 내용입니다.

조사 결과


TCP에서 이루어지는 것이 아니라 고급 프로토콜이나 응용을 통해 이루어진다.
방법으로는 다음과 같은 수단을 고려할 수 있다.
  • 특정 문자가 데이터의 끝에서 판별할 수 있도록(CRLF 등)
  • 메시지를 고정 길이로 설정(고정 길이 데이터가 도착하면 완성으로 판단)
  • 그룹 내 헤더(L7)에 기록된 데이터의 크기
  • 송신측 shutdown 쓰기→이때 수신측은recv에서 현재 온 내용만 있으면 됩니다
  • 어플리케이션을 통한 제어
  • socket 통신의 경우(L4)


    다음 코드를 써 보세요.
    이 예에서 응용 프로그램이 제어하는 방법을 써 보아라.
    ※ recv 반환치, 해당 데이터가 큰 시간 종료되지 않음
    client.py
    import socket
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.connect(('127.0.0.1', 50001))
    
    data = 'a' * 1024 * 1024 * 5 + 'bbb'
    server.send(data)
    
    server.py
    import socket
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('127.0.0.1', 50001))
    print('Server listen')
    
    server.listen(1)
    (connection, client) = server.accept()
    
    while True:
        try:
             print('Client connected', client)
             data = connection.recv(1024)
             if not data:
                 print "break"
                 break
             print(data)
        except socket.error:
            connection.close()
            break
    
    실행하면 서버야.py 출력은 다음과 같습니다.
    ('Client connected', ('127.0.0.1', 63949))
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    ('Client connected', ('127.0.0.1', 63949))
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    ('Client connected', ('127.0.0.1', 63949))
    bbb
    ('Client connected', ('127.0.0.1', 63949))
    break
    
    recv 시 1024byte 단위로 분할 수신data = connection.recv(1024)하기 때문에 이런 형식이 형성되었다.
    그러나 위리싱크에서 조를 나누는 것을 보고 마치 ~aaabb가 된 것처럼 TCP 흐름으로 붙어 비행한다.socket의recv는 지정한 1024byte에 따라 분할된다는 것을 잘 알고 있습니다.

    그럼 캡처를 다시 한 번 살펴보면 이런 형식으로 50001 listen 서버에서 TCP 통신이 발생했습니다.

    Length를 주목해보면 16388이 연속된 후 7467가 발생한다.이렇게 되면 이 화면을 보면 Length가 축소되었다는 것을 알 수 있다. 데이터는 쉽게 끝난다.
    프로그램으로 표현하면 이게 여기야.
    if not data:
        print "break"
        break
    
    1024byte가 TCP 흐름에서 얻은 데이터의 마지막 0byte를 Recv로 분할하면 돌아오기 때문에 데이터의 절구를 판단할 수 있습니다.

    주의 사항


    이 방법을 사용할 때, 예를 들어 데이터 통신이 끊겼을 때 데이터=0도 성립되고, 그 순간의 데이터의 엉덩이도 끊어진다.

    알 수 없는 점

  • HTTP는 어떻게 설치됩니까?살짝만 조사해보면 몰라요.
  • telnet/FTP 등은 CRLF를 구분 문자로 데이터의 세그먼트를 판단한다
  • 참고 자료

  • https://docs.python.org/ja/3/library/socket.html#socket.socket.recv
  • https://teratail.com/questions/99174
  • http://hp.vector.co.jp/authors/VA019876/sokrpg/doc/SockFAQ/sfaq01.html
  • http://www.ne.jp/asahi/hishidama/home/tech/socket/index.html#%E9%9B%BB%E6%96%87%E3%81%AE%E7%B5%82%E4%BA%86%E6%A4%9C%E7%9F%A5
  • 좋은 웹페이지 즐겨찾기