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

CH4. 커넥션 관리 #5

Open
sukstar76 opened this issue Mar 9, 2022 · 0 comments
Open

CH4. 커넥션 관리 #5

sukstar76 opened this issue Mar 9, 2022 · 0 comments

Comments

@sukstar76
Copy link

sukstar76 commented Mar 9, 2022

4장 주요 목적

  • HTTP 에서 TCP 커넥션 사용법
  • TCP 커넥션의 지연, 병목, 막힘
  • 병렬, keep-alive, 파이프라인 → 성능 최적화
  • 커넥션 관리에 따른 규칙들

신뢰 가능한 tcp

  • byte 를 순서에 따라 전송됨
  • 각 tcp segment는 ip패킷에 담겨 전달됨
  • ip패킷
    • ip 패킷 헤더

      스크린샷 2022-03-09 오후 4.49.39.png

    • tcp segment 헤더

      스크린샷 2022-03-09 오후 4.50.23.png

    • tcp 데이터

    • IP 헤더는 발신자와 목적지 IP 주소, 크기, 기타 플래그

    • TCP 세그먼트 헤더는 TCP 포트 번호, TCP 제어 플래그, 그리고 데이터의 순서와 무결성을 검사하기 위해 사용되는 숫자 값

  • (source ip, source port, dest ip, dest port) → 프로토콜 한정 식별자

http 트랜잭션 지연

  • 원인
    • dns 찾기 지연
    • 커넥션 생성 지연
    • 요청과 응답 지연
    • 하드웨어, 전송속도, 메세지 크기, 거리

성능 관련 중요 요소

  • 핸드셰이크 설정

    스크린샷 2022-03-09 오후 4.56.12.png

  • slow-start

    • awnd = minimum[rwnd,cwnd]
    • awnd : 전송 윈도우 크기 (송신할 수 있는 세그먼트 수)
    • rwnd : 수신 윈도우 크기 (수신측 버퍼 여유용량)
    • cwnd : 혼잡 윈도우 크기 (연결 초기 및 혼잡 상황`에서 사용되는 윈도우)

    스크린샷 2022-03-09 오후 4.58.11.png

  • nagle algorithm

    • 패킷을 줄여 → 효율성 증가
    • 전송 속도는 떨어짐

스크린샷 2022-03-09 오후 7.10.13.png

  • piggyback ack 을 위한 확인응답 지연 알고리즘

    • 인터넷 자체가 패킷 전송을 완벽히 보장하지는 않기 때문에, TCP는 성공적인 데이터 전송을 보장하기 위해서 자체적인 확인 체계를 가진다.
    • TCP 세그먼트는 순번과 데이터 무결성 체크섬을 가진다.
    • 송신자의 기준은 먼저 시작한 곳
      • 수신자는 세그먼트를 온전히 받으면, 작은 확인 응답 패킷을 송신자에게 반환한다. (ACK)
      • 송신자가 특정 시간 안에 확인 응답 메세지를 받지 못하면, 패킷이 파기되었거나 오류가 있는 것으로 판단하고 데이터를 다시 전송한다.
    • 데이터 보낼 때 같이 보내면 되겠다!
      • 확인 응답은 그 크기가 작기 때문에 TCP는같은 방향으로 송출되는 데이터 패킷에 확인 응답을 편승시킨다. (piggyback)
    • TCP는 송출 데이터 패킷과 확인 응답을 하나로 묶음으로써네트워크를 좀 더 효율적으로 사용한다.
    • 확인 응답 지연은 송출할 확인 응답을 특정 시간 동안(0.1초 ~ 0.2초) 버퍼에 저장해 두고,확인 응답을 편승시키기 위한 송출 데이터 패킷을 찾는다.
    • 막상 HTTP에서는
      • HTTP 동작 방식은 확인 응답이 송출 데이터 패킷에 편승할 기회를 감소시킨다.
      • 편승할 패킷을 찾으려고 하면, 해당 방향으로 송출될 패킷이 많지 않기 때문에,확인 응답 지연으로 인한 지연이 자주 발생한다.
  • time_wait 지연과 포트고갈

    스크린샷 2022-03-09 오후 5.41.47.png

    • time wait 필요한 이유
      • 지연 패킷이 발생할 경우
        • SEQ 까지 동일하다면 잘못된 데이타를 처리하게 되고 데이타 무결성 문제가 발생
      • 원격 종단의 연결이 닫혔는지 확인해야 할 경우
        • ACK 유실시 상대방은 LAST_ACK 상태에 빠지게 되고
        • 새로운 SYN 패킷 전달시 RST(reset) 를 리턴합니다.
        • 새로운 연결은 오류를 내며 실패합니다. 이미 연결을 시도한 상태이기 때문에 상대방에게 접속 오류 메시지가 출력될 것입니다.
    • 서버에 TIME_WAIT 상태가 남아 있으며, 클라이언트의 로컬 포트가 고갈된 경우
      • 클라이언트는 서버의 상태를 모름
      • 연결 맺기 위해 요청 → 로컬 포트 찾는데 과부하
    • 클라이언트에 TIME_WAIT 상태가 남아 있으며, 클라이언트의 로컬 포트가 고갈된 경우
      • 로컬 포트가 없어서 에러

Connection header

  • HTTP 헤더 필드 명은, 이 커넥션에만 해당되는 헤더들을 나열합니다.
  • 임시적인 토큰 값은 커넥션에 대한 비표준 옵션을 의미합니다.
  • close 값은 커넥션이 작업이 완료되면 종료되어야 함을 의미합니다.
  • hop by hop

커넥션 최적화

스크린샷 2022-03-09 오후 6.15.45.png

  • 병렬 커넥션

    스크린샷 2022-03-09 오후 6.19.56.png

    • 네트워크 대역폭이 작을 경우 효율성이 떨어짐
    • 짜피 slow start 있음
    • 병렬 커넥션 수는 제한
  • 지속 커넥션

    • HTTP 1.0
      • Connection : keep-alive
    • HTTP 1.1
      • 기본
      • Connection : close 명시

    스크린샷 2022-03-09 오후 6.35.52.png

    스크린샷 2022-03-09 오후 6.38.06.png

    스크린샷 2022-03-09 오후 6.38.39.png

파이프라인 커넥션

  • 지속 커넥션
  • 요청 모아서 보내기
  • 멱등성을 가지게 보내야함

커넥션 끊기

  • Content-Length

    • 실제 받은 길이와 Content-Length 로 비교해서 문제 없을을 확인
  • graceful close

    • 타임 아웃을 두고 전송된 패킷 모두가 정상적으로 전송된 뒤 깔끔하게 close
    • 어플리케이션 수준에서 → 바꿀수있음 ex ) 강제 셧다운 이라던지...
    struct  linger {
    int l_onoff;    /* option on/off */
    int l_linger;   /* linger time */
    };
    
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

No branches or pull requests

1 participant