Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix] Network 서비스에서 사용할 NWParameter 옵션 변경 #153

Merged
merged 1 commit into from
Jan 16, 2025

Conversation

choijungp
Copy link
Collaborator

🌁 Background

리뷰 노트 참고

👩‍💻 Contents

  • Network 서비스에서 사용할 NWParameter 옵션 변경

📝 Review Note

기존에는 NWParameter에서 클래스 변수로 제공하는 tcp를 이용하여 네트워크 서비스를 구축했습니다. 하지만 아래와 같은 문제로 tcp옵션을 커스텀해야 할 필요성을 느꼈습니다.

  1. NWParameter.tcp의 connectionTimeout 시간은 기본적으로 0으로 설정되어 있습니다.
    이 connectionTimeout은 TCP가 establish하여 connection을 연결하는데 걸리는 시간을 제한합니다.
    한 가지 유의할 점은, 이 connectionTimeout이 0이면 연결 대기를 제한된 시간동안 진행하는 것이 아닌 무기한 대기한다는 점입니다. 따라서 저희는 임의로 5초로 설정하였습니다. (범용적으로 많이 사용하는 connectionTime시간에 대해서는 잘 알지 못해서.. 적절한 설정값이 있으면 추후 수정하겠습니다.)

  2. 실기기를 이용한 테스트 중 종종 앱을 강제 종료하면 상대방 기기에서 연결이 정상적으로 끊어지지 않는 문제가 있었습니다.
    TCP는 연결 기반의 전송 계층 프로토콜입니다. 따라서 연결을 끊을 때도 handshake를 통해 연결을 종료하게 되는데요, 이 연결을 끊기 위한 handshake가 정상적으로 동작하지 않아 위와 같은 문제가 일어나는 것이라 추측했습니다. (패킷 로스 또는 handshake가 정상적 수행 안됨).
    이를 해결하기 위해 Keep-Alive가 필요했습니다. Keep-Alive는 장시간 연결이 유휴 상태일 때도 연결을 유지(persistence connection을 유지)하기 위한 옵션입니다. Keep-Alive의 간단한 동작 방식은 아래와 같습니다.

  • A, B가 연결이 되어 있다가 B가 비정상적으로 연결을 끊어버렸다고 가정하겠습니다. 이때 A의 tcp 소켓은 여전히 열려있을 것입니다.
  • 장기간 B와 교류가 없다면, A는 B에게 keep-alive 패킷을 전송하고, 이에 대한 ack를 받지 못하면 연결을 종료합니다.

NWParameter.tcp는 기본적으로 Keep-Alive 기능이 꺼져있어서 커스텀 NWProtocolTCP의 option에서 해당 기능을 enable하게 수정했습니다.

@taipaise taipaise force-pushed the refactor/NearbyNetwork branch from 431e67c to 47641ba Compare January 15, 2025 00:40
Copy link
Member

@eemdeeks eemdeeks left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰노트를 통해 설명 잘 읽어보았습니다!!
단번에 이해가 되는 내용들이네요 :)
필요한 이유와 내용에 대해 설명 잘 해주셔서 좋습니다!! 👍

Comment on lines +42 to +49
let tcpOption = NWProtocolTCP.Options()
tcpOption.enableKeepalive = true
tcpOption.keepaliveIdle = 5
tcpOption.keepaliveCount = 2
tcpOption.keepaliveInterval = 3
tcpOption.connectionTimeout = 5
tcpOption.connectionDropTime = 5
tcpOption.persistTimeout = 5
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와우 이런 기능들을 딸깍 한번으로 가능한구요..?

나중에 기회가 된다면, 이런 option설정하는 것도 따로 뺄 수 있으면 좋겠네요!!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

따로 분리하는 것도 좋은 생각인 것 같습니다!!
나중에 설정이 더 복잡해지면 꼭!!!! 분리하겠습니다

Copy link
Collaborator

@ekrud99 ekrud99 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Network 프레임워크에 대해 잘 이해하고 있는 거 같습니다!
리뷰 노트의 두 가지 이유 모두 기존 파라미터를 커스텀 해야 할 충분한 이유가 되는 것 같습니다.
고생하셨습니다!!

@taipaise taipaise merged commit 34f18a4 into develop Jan 16, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants