해결된 질문
작성
·
481
0
안녕하세요 선생님~
tcp 관련해서 질문을 드리고 싶습니다. ^^
tcp 버퍼라는게 따로 존재하나요? 아니면 소켓 버퍼가 곧 tcp 버퍼인가요?
segmentation된 데이터는 어디서 조립되나요? 만약 소켓 버퍼에서 조립된다면 recv했을 때 덜 조립된 데이터를 받거나 하진 않는지 궁금합니다.
관련 책에서 본 내용인데요, 송신 버퍼에 1바이트의 여유만 있어도 tcp는 send가 가능하다는데 이러면 데이터가 다른 관련없는 데이터와 섞여서 송신되거나 하지는 않나요?
다른건 안그러는데 이상하게 네트워크 쪽만 공부하면 자꾸 깊게 파고들려고 하네요. ;;
호기심을 적당히 가져야 진도를 빠르게 뺄텐데... 그래도 좋게 생각해야겠죠? ㅎㅎ
항상 좋은 강의 감사드립니다~^^
답변 2
1
수신측 입장에서...
순서가 맞고 빠진 것이 없다면 소켓 버퍼로 보냅니다. 여기서 한 가지 더 생각해야 할 것은 네트워크 속도 입니다. 네트워크 속도가 느리다면 세그먼트 하나에 대해 recv() 함수가 바로 반환 할 수도 있습니다. 즉, TCP 버퍼로 세그먼트가 모이고 조립되어 소켓 버퍼로 넘어 간다고 했을 때 TCP는 정해진 내부 규칙에 따라 데이터를 더 기다리고 모아 조립해 소켓 버퍼로 보낼지 아니면 바로 보낼지 판단합니다. 타이머가 있는 것이지요. 이 시간을 계산하는 규칙에 따라 TCP 이름이 바뀝니다. Compound TCP나 Cubic 같은 이름이 붙습니다.
결과적으로 1, 2번 둘 중 하나가 아니라 둘 다 적용되며 핵심은 타이머 값입니다. 무엇보다 네트워크 불안정 할 경우 TCP 혼잡상황이 발생하고 그에 따라 타이머 값이 다시 계산됩니다. 그런 차원에서 send()와 recv()가 1:1로 매핑되지 않는 다는 점을 더 확실히 알 수 있겠습니다.
참고하시기 바랍니다.
1
따로 존재합니다. 모든 OS가 다 그렇다고 하기는 어렵지만 일반적인 범용 OS는 그렇다고 생각해도 되겠습니다.
TCP 수준에서 합니다. 여기에 사용되는 버퍼를 제가 강의에서 TCP 버퍼라고 부르고 있습니다. TCP가 세그먼트 조립을 끝낸 후 사용자 프로세스에 전달(recv함수 반환)하기 때문에 조립이 덜 됐을 가능성은 없다고 봐도 됩니다. 만일 조립이 실패한다면 TCP연결이 자체가 아예 끊겨 버릴 것이기 때문입니다. (TCP 세션 리셋)
확인한 것은 아니지만 그렇게 작동할 것으로 추측이 됩니다. 이 과정에서 데이터가 서로 섞인 다는 것이 프로세스 간 데이터가 엉키는 경우를 의미하는 것이면 이는 사실 상 불가능합니다. 이미 가상 메모리 시스템에서 정확히 구분하고 있기 때문입니다. 모든 프로세스에 대한 TCP 송신을 OS가 하고 있지만 기본적으로 메모리에 저장된 데이터를 구분해 송신합니다.
그리고...저도 그랬습니다. DB에 대해서는 전혀 흥미를 느끼지 못했는데 네트워크는 참 즐겁고 재밌었던 기억이 있습니다. 진도도 중요하지만 제대로 아는 것도 중요합니다. 그러니 걱정은 안 하셔도 되겠습니다. 건투를 빕니다!
선생님~~ㅠㅠ
아무래도 제가 뭔가 착각하고 있나 봅니다
선생님께서 말씀하시는 조립이 정확하게 어떤건지 잘 모르겠습니다...
예를 들어서 엄청 큰 데이터를 보낸다고 치면
tcp 수준에서도 세그먼트를 엄청 많이 만들어서 보낼텐데
수신측의 입장에서 보면, 여기서 선생님이 말씀하시는게..
1. 순서만 맞으면 세그먼트가 하나라도 바로 소켓 버퍼에 보낸다. 안맞으면 tcp 버퍼를 통해서 순서를 맞춘다
2. 세그먼트를 tcp 버퍼에 모으다가 전부 모이면 한꺼번에 소켓 버퍼로 보낸다
중에서 어떤 거를 말씀하시는 건가요..?
저는 지금까지 2번으로 생각하고 있었는데...
tcp는 메세지가 아니라 스트림이고, 강의에서도 송신과 수신은 일대일이 아니라고 하시니까
뭔가 잘못 생각한거 같아서 다시금 질문을 드립니다.ㅠㅠ
참...아는게 없으니 질문도 똑바로 못하네요
부끄럽습니다... 죄송합니다. ㅠㅠ
그렇군요...생각해야 될게 참 많네요
더 열심히 공부해야겠습니다..감사합니다!