장치 TX 링에 쓰기를 대기열에 넣을 수 없으면 TCP는 어떻게 되나요?

장치 TX 링에 쓰기를 대기열에 넣을 수 없으면 TCP는 어떻게 되나요?

장치 tx 링이 가득 차고 일반적인 C 비차단 쓰기(fd, buff)를 수행하여 데이터를 TCP SND 버퍼에 대기열에 추가한다고 가정합니다.

이 작업이 실패하면 어떻게 되나요? UDP에서는 패킷이 삭제되지만 TCP에서는 어떻게 되나요?

컨텍스트는 다음과 같습니다.

비차단 방식으로 일련의 TCP 소켓에 데이터를 순차적으로 보내는 테스터가 있습니다. SND BUFF를 채우기에 충분한 데이터를 보냅니다.

제가 테스트하고 있는 조건은 500개 연결 중 몇 개에 대해 SND BUFF를 채운 후 몇 초 동안 비차단 폴링에서 OPS_WRITE 이벤트를 수신하지 않는다는 것입니다. 때로는 최대 2~3초 동안 설문조사에서 아무것도 얻지 못하는 경우도 있습니다.

TX RING을 512에서 2048로 늘렸는데 이제 네트워크 카드가 10초 이상 용량에 도달하지 않으면 이런 일이 발생하지 않습니다.

답변1

~에서쓰기(2),

실수

      ⋮

이가온또는에드워드 블록

    파일 설명자FD소켓을 참조하며 비차단으로 표시되었습니다(O_비차단), 쓰기가 차단됩니다. POSIX.1-2001은 이 경우 오류 중 하나가 반환되는 것을 허용하고 이러한 상수가 동일한 값을 가질 것을 요구하지 않으므로 이식 가능한 응용 프로그램은 두 가지 가능성을 모두 확인해야 합니다.

즉, write-1이 반환되고 또는 errno로 설정 됩니다 . (물론 버퍼에 있는 데이터는 전송되지 않습니다.)EAGAINEWOULDBLOCK

관련 정보