protected
means that you can access the member from any subtype (and of course from the declaring type itself). So regardless of where that subtype is, even if it is in another assembly, you will still have access to all protected members.
internal
means that you can access the member from any type in the same assembly. So even a completely unrelated class that lives in the same assembly can access the member.
protected internal
combines both, meaning that both apply separately. So you can access the member from any subtype, and you can also access the member from any type in the same assembly.
// Assembly 1
class A {
protected int foo;
internal int bar;
protected internal int baz;
}
class B : A {} // can access: foo, bar, baz
class C {} // can access: bar, baz
// Assembly 2
class D : A {} // can access: foo, baz
class E {} // can access neither